Perlで文字列からチェーン式を評価するにはどうすればよいですか?
-
22-07-2019 - |
質問
これらのタイプの式を何と呼ぶべきか本当にわからないので、例の方が簡単でしょう...
Perlにa < b <= c
のような式を評価する方法はありますか?ユーザーが特定のアクションに条件式を提供できるようにする構成ファイルがあります。 (通常コードで行うように)条件を2つの部分に分割するのではなく、可能であれば、このように表現したいと思います。
解決
これは確かにPerl 6で登場します。しかし、残念ながら、Perl 5.10が借用したPerl 6のものの1つではないと思います。
他のヒント
連鎖比較はPerl 6に搭載されています。
今、はPerl 5.x用のデイジーチェーンサブルーチンを作成することは可能ですか?それは興味深い質問です...
これは少し読みにくいですが、あなたが望むものを実現します:a < b && b <= c
他の人が言及したように、Perl5は(まだ)連鎖比較をしていません。
ただし、解析する場合は<!> quot; a <!> lt; b <!> lt; = c <!> quot;構成ファイルから、それを評価したいだけの場合は、おそらくこれはあなたのステアリングの後でしょうか?
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