web-dev-qa-db-ja.com

Perlでの$ 1とはどういう意味ですか?

Perlでの$ 1とはどういう意味ですか?さらに、$ 2はどういう意味ですか? $ number変数はいくつありますか?

62
Chad DeShon

$number変数には、キャプチャグループ( ... )マッチが成功した場合、最後の正規表現マッチのパターンで。

たとえば、次の文字列を使用します。

$text = "the quick brown fox jumps over the lazy dog.";

声明の後

$text =~ m/ (b.+?) /;

$1は、テキスト「brown」と同じです。

65
rlbond

数値変数は、最後に適用したsuccessful一致または置換演算子からの一致です:

my $string = 'abcdefghi';

if( $string =~ /(abc)def(ghi)/ ) {
    print "I found $1 and $2\n";
    }

$ 1などを使用する前に、一致または置換が成功したことを常にテストしてください。そうしないと、別の操作から残り物を拾う可能性があります。

Perlの正規表現は perlre で文書化されています。

34
Jim Puls

$ 1、$ 2などには、最後のsuccessfulマッチからのキャプチャの値が含まれます。それらにアクセスする前に、マッチが成功したかどうかを確認することが重要です。

 if ( $var =~ m/( )/ ) { # use $1 etc... }

問題の例-$ 1には、以下の両方の印刷ステートメントに「Quick」が含まれています。

#!/usr/bin/Perl

'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";

'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";
11
plusplus

他の人が指摘したように、$ xは正規表現のキャプチャ変数であり、一致したパターンのセクションを参照できます。

Perlは、名前付きキャプチャもサポートしています。名前付きキャプチャは、場合によっては人間が覚えやすい場合があります。

与えられた入力:111 222

/(\d+)\s+(\d+)/

$ 1は111です

2ドルは222です

また言うことができます:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/

$ + {myvara}は111です

$ + {myvarb}は222です

9
Einstein

これらは「一致変数」と呼ばれます。前述のように、それらには最後に一致した正規表現のテキストが含まれています。

詳細はこちら: http://cslibrary.stanford.edu/108/EssentialPerl.html

(対応するセクションを見つけるための「変数の一致」のCTRL-F)

6
John T

キャプチャグループに尋ねたので、$ +についても知りたいと思うかもしれません。

use Data::Dumper;
$text="hiabc ihabc ads byexx eybxx";
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs)
{
    print Dumper $+;
}

出力:
$ VAR1 = 'hi';
$ VAR1 = 'ih';
$ VAR1 = 'さようなら';
$ VAR1 = 'eyb';

3
Hemanth Gowda

Perlの「マジック」変数に関する一般的な質問は、次のようにPerlの事前定義変数のドキュメントを参照することで回答できます。

perldoc perlvar

ただし、このドキュメントで$ 1などを検索すると、これらの「数字」変数に関するセクションを除き、多くの場所で参照が見つかります。検索する必要があります

$<digits>

私はこれを Brianの答え にコメントや編集で追加したでしょうが、十分な担当者がいません。誰かがこれを追加したら、この答えを削除します。

2
benrifkah

私は2**32 -1 32ビットコンパイルされたPerlバイナリの番号付き一致変数。

0
Brad Gilbert

変数$ 1 .. $ 9も読み取り専用変数なので、暗黙的に値を割り当てることはできません。

$ 1 = 'foo';印刷$ 1;

エラーが返されます:スクリプト行1で読み取り専用の値を変更しようとしました。

変数名の先頭に数字を使用することもできません。

$ 1foo = 'foo'; print $ 1foo;

上記もエラーを返します。

0
user118435