Perl에서 문자열에서 묶은 표현식을 어떻게 평가할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1824460

  •  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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top