1

私はperlと正規表現を学んでいます。次のコード:

my $data = "Bule beatles battling a blowing breeze";
my $results = $data =~ m/beatles battling/;
print "results: $results\n";

次の出力が生成されます。

C:\scripts\perl\sandbox>regex.pl
results: 1

少し変更すると、必要な結果が得られます。

print "results: $&\n";
results: beatles battling

また、$results を作成する必要がないことにも気付きました。

my $data = "Bule beatles battling a blowing breeze";
$data =~ m/beatles battling/;
print "results: $&\n";

私が読んでいるさまざまな perl チュートリアルでは、いくつかの例で次の構文が使用されています。

my $results = $data =~ m/string_to_match/;

私の質問:

  • $data に対して直接正規表現を実行する代わりに、いつ $results を作成する必要がありますか?
  • $data を印刷しようとすると「1」が返されるのはなぜですか? (マッチの長さを返していると思います...)
  • $results を作成すると便利ですか? いいえの場合、複数の結果をどのように処理しますか?

例えば:

my $data = "Bule beatles battling a blowing breeze";
my $results1 = $data =~ m/beatles/;
my $results2 = $data =~ m/battling/;

どうもありがとう :)

4

2 に答える 2

8

スカラー コンテキストでの通常の正規表現の一致は、パターンが一致したかどうかを示すブール値を返します。一致した部分文字列は返されません (非効率的です!)。

一致した部分文字列にアクセスするには、パターンを括弧で囲みます。そのパターンの内容は、 list context$1で、または最初の戻り値として利用できます。

my $data = "Bule beatles battling a blowing breeze";
my ($result) = $data =~ /(beatles battling)/;
say $result;

出力: beatles battling.

パターンにさらに多くのキャプチャがある場合、その内容は$2$3、 … になります。リストコンテキストからアクセスすることもできます:

my ($substring, $beatles, $battling) = $data =~ /((beatles) (battling))/;

$&ゴルフをしている場合や、効率やスタイルが問題にならないワンライナーで使用する場合を除いて、 は使用しないでください。

$&etc. を使用すると、すべてのパターン マッチでグローバルにオーバーヘッドが発生します。あなたはそれを望んでいません。

于 2013-07-07T19:40:12.017 に答える