- ベストアンサー
$1 と =~ の意味を教えて下さい
perlで書かれたとある掲示板に機能追加すべくソースをいじってます。 意味のわからないコードがあるので、教えて下さい。 $skin =~ s/(name="s_word")/$1 value="$in{s_word}" とか、 $hogehoge = $1; のような感じで出てくる、$1ってどういう変数なのでしょうか? どういったときに用いられるのでしょう? また、=~ というのは、どういう意味なのでしょうか? どなたか、ご教授下さいませ。 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> $hogehoge = $1; の場合の、$1は違う意味合いになるのでしょうか? この $1 も同じものです。 よく似たものに \1 という後方参照用の特殊変数があります。働きは $1 と全く同じです。 たとえば、HTMLから「前後を対のタグで挟まれた部分」を探すとき、 <.+?>.*?</.+?> と書いてしまうと、「<LI>ABC</UL>」なんていうのまでマッチしてしまいますよね。 そうではなく、「ULで始まったらULで閉じている部分」をマッチさせたいときは、 <(.+?)>.*?</\1> と書きます。そうすると「<UL><LI>ABC</UL>」というように、正しい対になっている部分にのみマッチします。 最初の括弧の部分で見つけたものが、\1 に格納されているからです。 ところが、\1 や \2 は、その寿命(値保持)はパターンの中だけです。たとえば、見つけた後にその見つけたタグは何だったのか?処理の中で使いたいときがあり、そんなとき使えるのが $1 や $2 です。こちらは \1 や \2 と働きは同じで、その寿命が長いものです。具体的には、ブロック{}の中、または次に他の値が入れられるまで値を保持しています。 例 if (/<(.+?)>(.*?)</$1>/) { print "$1 タグで挟まれた部分は「$2」です。" } ちなみに、後方参照用の特殊変数には、 $+ $& $` $' などもあります。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>$hogehoge = $1; の場合の、$1は違う意味合いになるのでしょうか? 同じ意味合いです。 この文の前にある何らかの正規表現のマッチングを行ったグループを その正規表現のマッチングをさせた式よりあとでも(次のマッチングとかで更新されるまで)使うことができます。
お礼
先の方の回答で、$1は、その前に存在している( )内の値が格納されるという意味だとわかりました。 つまり、$hogehoge = $1;の前に存在している( )内に何が記述されているか、そしてそこにどんな値が格納されてくるのかを考えれば、$hogehoge変数に、何が代入されるのかを想像できるということですよね。 ありがとうございました。
- taseki
- ベストアンサー率66% (155/233)
$1 は後方参照用の特殊変数です。 括弧つきのパターンマッチを実行した後で、マッチした文字列を参照できます。 /Yahoo|Google/ と書くと、「Yahoo」または「Google」という文字列を探します。 これに括弧を付けて、 s/(Yahoo|Google)/$1 Japan/g と書くと、「Yahoo」を「Yahoo Japan」に、「Google」を「Google Japan」に変換します。つまり「見つけたのは何だったのか?」を後から知る(参照する)ことができます。(後方参照) 後方参照せずに、普通の括弧の働き、つまり単にグループ化させたいだけなら (?:~) と書きます。 =~ は、デフォルトではパターンマッチングは変数 $_ に対して行いますが、それ以外の変数に対して行いたいときに、結びつけるための演算子です。 =~ の真偽が逆になるのが !~ です。 これらはperlの基本ともいえるので、しっかり習得されてから進めることをおすすめします。
お礼
ありがとうございます。 $1 は後方参照用の特殊変数というのはご説明で理解できてきた感じです。 しかし、$hogehoge = $1; の表現がわかりません。 $hogehoge = $1; の場合の、$1は違う意味合いになるのでしょうか?
- mendokusa
- ベストアンサー率13% (359/2726)
この辺で↓
お礼
$1 は、まだ理解不透明ですが、 =~ は、理解できた感じです。 ありがとうございました。
お礼
\1も$1も、その前に存在している( )内の値が格納されるという意味ですね。 つまり、$hogehoge = $1;の前に存在している( )内に何が記述されているか、そしてそこにどんな値が格納されてくるのかを考えれば、$hogehoge変数に、何が代入されるのかを想像できるということですね。 奥が深いようですが、このあたりが自由に使いこなせると、かなりperlをモノにできそうな気がします。 いろいろなパターンのテストコードを書いてみて、もっと理解を深めてみたいと思います。 取りあえず、引っかかっている部分は、解消できました。 どうも、ありがとうございました!