2

応答ヘッダーのような文字列を考えてみましょう: HTTP/1.1 404 Not Found.

スマートマッチ (~~または二重チルダ) 演算子と正規表現の組み合わせを使用して、一致の不完全またはサブセットを検索できるかどうか知りたいです。

my $head    = q{HTTP/1.1 404 Not Found};
my @success = (200, 201);
my @failure = (404, 409);

# Array First
say q{Success} if @success ~~ $head;
say q{Fail}    if @failure ~~ $head;

# Array Second
say q{Success} if $head ~~ @success ;
say q{Fail}    if $head ~~ @failure ;

これは、ある種のループ、grep、またはマップで実行できることを知っています。~~しかし、できることとできないことの可能性を調べています。

ドキュメントはかなり説明的であり、lhs/rhs 条件の大部分では、[左側のすべて] == [右側のすべて]評価に対して true を返すようです。

とはいえ$head、 が数字 (例: $head=q{200}) であれば一致します。


期待される結果は次のようになります。

my $head      = q{HTTP/1.1 201 OK};
my @success   = qw(200 201);
say q{Success} if grep{$head =~ /$_/ } @success;
4

1 に答える 1

1

Schwern が以前に指摘したように、スマート マッチ演算子は現在、実験的/非推奨[1]としてマークされているため、スマート マッチ演算子への切り替えはお勧めしません。

その上、とにかく正規表現を構築する方がおそらく良いでしょう。

my @success = (200, 201);
my @failure = (404, 409);

my $success_pat = join '|', map quotemeta, @success;
my $failure_pat = join '|', map quotemeta, @failure;

my $success_re = qr/$success_pat/;
my $failure_re = qr/$failure_pat/;

say q{Success} if $head =~ $success_re;
say q{Fail}    if $head =~ $failure_re;

  1. それぞれの仕様が何をすべきかについて常に不一致があったため、Perl はより明確なもの、おそらくSmart::MatchのアプローチのTHING ~~ THINGようなものに移行しています。THING ~~ FUNC(THING)
于 2013-05-30T19:29:04.787 に答える