Perl에서 문자열에서 묶은 표현식을 어떻게 평가할 수 있습니까?
-
22-07-2019 - |
문제
이 유형의 표현을 무엇이라고 부를지 잘 모르겠으므로 예를 들어 더 쉬울 것입니다 ...
Perl에는 다음과 같은 표현을 평가하는 방법이 있습니까? a < b <= c
? 사용자가 특정 작업에 대한 조건부 표현식을 제공 할 수있는 구성 파일이 있습니다. 조건을 두 부분으로 나누기보다는 (일반적으로 코드에서하는 것처럼) 가능한 경우 이런 식으로 표현하고 싶습니다.
해결책
확실히 Perl 6에 나옵니다. 그러나 불행히도, 나는 그것이 Perl 5.10에 의해 빌린 Perl 6의 것 중 하나라고 생각하지 않습니다.
다른 팁
사슬 비교 Perl 6에 소개됩니다.
지금, Perl 5.x에 대한 데이지 체인 하위 경로를 만들 수 있습니까?? 흥미로운 질문입니다 ...
이것은 약간 덜 읽기 쉬지만 원하는 것을 달성합니다. a < b && b <= c
다른 사람들이 언급했듯이 Perl5는 (아직) 비교를 묶지 않았습니다.
그러나 구성 파일에서 "a <b <= c"를 구문 분석하고 그것을 평가하고 싶다면 아마도 이것이 당신의 조향이 무엇인지에 대해?
use strict;
use warnings;
use 5.010;
my ($a, $b, $c) = (10, 20, 30);
say 'Its true!' if comparison( $a, '<', $b, '<=', $c );
sub comparison {
my $left = shift;
while (my $cmp = shift) {
my $right = shift;
compare( $cmp, $left, $right ) or return;
$left = $right;
}
return 1;
}
sub compare {
my $op = shift;
given ($op) {
when ( '<' ) { return $_[0] < $_[1] }
when ( '<=' ) { return $_[0] <= $_[1] }
default { die "Invalid comparison operator" }
}
}
그것의 유일한 기본 예제 (즉, 완전하지 않고 오류 점검 없음)이지만 아이디어를 얻는 것 같습니다.
그리고 당신은 이미 이런 것을 찾을 수 있습니다 CPAN
. 같은 것 Parse::RPN
아마도 유용한 빌딩 블록 일 것입니다.
이제 문자 그대로 구문 분석하는 방법에 대한 질문이 있다면 a < b <= c
그러면 그것은 또 다른 물고기의 주전자입니다!
/i3az/
현재의 입력 유효성 검증 또는 최종 비교의 실행을 무시하면 다음 코드 (또는 사소한 변형)가 귀하의 진술을 다시 작성할 수 있어야합니다.
sub rewrite {
my $str = shift;
my $ops = join "|" => qw/ < > <= >= == != /;
1 while $str =~ s/ ($ops) \s* (\w+?) \s* ($ops) /$1 $2 && $2 $3/xg;
$str
}
print rewrite "a < b < 5 < c != d";
# prints a < b && b < 5 && 5 < c && c != d