3

「Programming Perl」の本にはスニペットがあります (切り取られています):

デフォルトでは、 when(EXPR) は、$_;つまりの暗黙のスマートマッチとして扱われ$_ ~~ EXPRます。ただし、when への EXPR 引数が以下にリストされている 10 の例外的な形式の 1 つである場合、ブール値の結果に対して直接評価され、スマートマッチングは発生しません。

  1. ...

  2. /REGEX/、$foo =~ /REGEX/、または $foo =~ EXPR の形式の正規表現一致。

とはどういう意味evaluated directly for a Boolean resultですか?

例:

#!/usr/bin/perl
use v5.14;
my @a = ('aaa', 'bbb', 'ccc');

given(@a) {
    when (/a/) { say '@a contains an a'; }
    default    { say '@a does not contain an a' }
}

私がそれを実行すると、出力は時々変化します:

@a does not contain an a

@a contains an a

@a does not contain an a

@a does not contain an a

ここで何が起こっているのか理解できません。誰か助けてくれませんか?

事前に感謝します。

4

4 に答える 4

11

ドキュメントを注意深く読んでください。

もう 1 つの便利なショートカットは、"given" の引数としてリテラル配列またはハッシュを使用すると、それが参照に変わることです。たとえば、「given(@foo)」は「given(\@foo)」と同じです。

したがって、given (@a)に変わりgiven(\@a)ます。when (/a/)を使用しているため、スマート マッチングはありません。

\@a =~ /a/

参照は文字列化されています。のように「a」が含まれることもありますARRAY(0x9a4e7f8)が、通常は含まれません :-)

于 2012-07-27T12:20:56.667 に答える
5

ドキュメントは、配列要素のいずれかが正規表現に一致するかどうかをチェックする とwhen (/a/)同等ではなく、単にスカラーが一致するかどうかをチェックする と同等であることを意味します。if ($_ ~~ /a/)if ($_ =~ /a/)$_

配列を渡すと、その配列への参照givenが割り当てられます。また、(ドキュメントにあるように) スマート マッチ演算子が使用されていないため、条件 likeは と同等です。when (/a/)\@a =~ /a/

正規表現の一致が試行される前に参照が文字列化されるため、次のように比較されますARRAY(0x61c6dc)。文字列で小文字を探しているのでa、文字列内の 16 進配列の場所にたまたまa. あなたが望んでいたものではありません!

于 2012-07-27T12:31:19.960 に答える
4
when ('a')
when (123)

の略です

when ($_ ~~ 'a')
when ($_ ~~ 123)

そのリストは、その動作の例外です。あなたが具体的に求めているのは手段

when (/b/)
when ($x =~ /c/)

の略ではありません

when ($_ ~~ /b/)
when ($_ ~~ $x =~ /c/)

それらには、通常の (外のwhen) 意味があります。つまり、

when ($_ =~ /b/)
when ($x =~ /c/)
于 2012-07-27T14:59:00.693 に答える
4

when(/a/)のようなことを実際に行いますが、好きif (/a/)ではありませんif ($_ ~~ /a/)。後者が必要な場合は、when (qr/a/)代わりに使用する必要があります。

于 2012-07-27T13:50:29.273 に答える