4

Perl のqr演算子 について質問があります。

#!/usr/bin/perl -w
&mysplit("a:b:c", /:/);  
sub mysplit {  
    my($str, $pattern) = @_;  
    my @arr = split $pattern, $str;  
    print "@arr\n";  
}

結果は次のとおりです。

./test.pl 行 3 のパターン マッチ (m//) で、初期化されていない値 $_ が
使用されています。./test.pl 行 7 で、正規表現のコンパイルで初期化されていない値 $pattern が使用されています。

しかし、私が使用した場合: &mysplit("a:b:c", qr/:/);、それは大丈夫です。だから、私は知りたいと
の違いは何ですか? なぜここに関連しているのですか? そして、なぜそれは大丈夫ですか? qr//m//
$_
split /:/, "a:b:c";

前もって感謝します!

4

2 に答える 2

11

さて、ここでの問題は、次の式です。

/:/

本当にこれを意味します:

$_ =~ /:/

これが、perl が で初期化されていないエラーを報告している理由$_です。

演算子にはこのqr()ショートカットがないため、この場合、それ自体が許容されるステートメントです。

だから、明確にするために:あなたの声明:

&mysplit("a:b:c", /:/);

本当にこれを意味します:

&mysplit("a:b:c", $_ =~ /:/);

$_は定義されていないため、正規表現の一致は空のリストを返します。空の文字列が返される可能性がありますが、リスト コンテキストがあるため、空のリストが返され、エラーがもう少し明白になります。

空のリストが返されるため、 に渡される引数は 1 つだけmysplit()です。そのため、2 番目の警告が表示されます。

Use of uninitialized value $pattern in regexp compilation at ./test.pl line 7.

空の文字列が渡された場合、エラーのこの部分は表示されません。

&また、サブルーチン呼び出しの前にアンパサンドを使用すると、特定の機能があることを知っておく必要があります。その機能を使用するつもりがない限り、使用しないでください。perldoc perlsubに記載されているように、サブルーチンを呼び出すさまざまな方法は次のとおりです。

NAME(LIST);  # & is optional with parentheses.
NAME LIST;   # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME;       # Makes current @_ visible to called subroutine.

あなたの場合、デフォルトの方法は一番上の方法です:mysplit(...)

于 2013-05-30T09:02:48.787 に答える