Как я могу оценить цепочечные выражения из строки в Perl? - PullRequest
4 голосов
/ 01 декабря 2009

Я не совсем уверен, как называть выражения такого типа, поэтому пример будет проще ...

Есть ли способ в Perl для оценки выражений типа a < b <= c? У меня есть файл конфигурации, который позволяет пользователю предоставлять условные выражения для определенных действий. Вместо того, чтобы разбивать условие на две части (как я обычно это делаю в коде), я хотел бы представить его таким образом, если это возможно.

Ответы [ 5 ]

2 голосов
/ 01 декабря 2009
2 голосов
/ 01 декабря 2009

Это наверняка в Perl 6. Но, к сожалению, я не думаю, что это одна из вещей, которые Perl 6 позаимствовал у Perl 5.10.

0 голосов
/ 02 декабря 2009

игнорируя любую проверку ввода или выполнение возможного сравнения на данный момент, следующий код (или его незначительное изменение) должен быть в состоянии переписать ваше утверждение:

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
0 голосов
/ 01 декабря 2009

Как уже упоминали другие, в Perl5 (пока) нет цепных сравнений.

Однако, если вы анализируете "a 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 /

0 голосов
/ 01 декабря 2009

Это немного менее читабельно, но выполняет то, что вы хотите: a < b && b <= c

...