• ベストアンサー

$1 と =~ の意味を教えて下さい

perlで書かれたとある掲示板に機能追加すべくソースをいじってます。 意味のわからないコードがあるので、教えて下さい。 $skin =~ s/(name="s_word")/$1 value="$in{s_word}" とか、 $hogehoge = $1; のような感じで出てくる、$1ってどういう変数なのでしょうか? どういったときに用いられるのでしょう? また、=~ というのは、どういう意味なのでしょうか? どなたか、ご教授下さいませ。 よろしくお願い致します。

  • THUBAN
  • お礼率76% (771/1002)
  • Perl
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.3

> $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」です。" } ちなみに、後方参照用の特殊変数には、 $+ $& $` $' などもあります。

THUBAN
質問者

お礼

\1も$1も、その前に存在している( )内の値が格納されるという意味ですね。 つまり、$hogehoge = $1;の前に存在している( )内に何が記述されているか、そしてそこにどんな値が格納されてくるのかを考えれば、$hogehoge変数に、何が代入されるのかを想像できるということですね。 奥が深いようですが、このあたりが自由に使いこなせると、かなりperlをモノにできそうな気がします。 いろいろなパターンのテストコードを書いてみて、もっと理解を深めてみたいと思います。 取りあえず、引っかかっている部分は、解消できました。 どうも、ありがとうございました!

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>$hogehoge = $1; の場合の、$1は違う意味合いになるのでしょうか? 同じ意味合いです。 この文の前にある何らかの正規表現のマッチングを行ったグループを その正規表現のマッチングをさせた式よりあとでも(次のマッチングとかで更新されるまで)使うことができます。

THUBAN
質問者

お礼

先の方の回答で、$1は、その前に存在している( )内の値が格納されるという意味だとわかりました。 つまり、$hogehoge = $1;の前に存在している( )内に何が記述されているか、そしてそこにどんな値が格納されてくるのかを考えれば、$hogehoge変数に、何が代入されるのかを想像できるということですよね。 ありがとうございました。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

$1 は後方参照用の特殊変数です。 括弧つきのパターンマッチを実行した後で、マッチした文字列を参照できます。 /Yahoo|Google/ と書くと、「Yahoo」または「Google」という文字列を探します。 これに括弧を付けて、 s/(Yahoo|Google)/$1 Japan/g と書くと、「Yahoo」を「Yahoo Japan」に、「Google」を「Google Japan」に変換します。つまり「見つけたのは何だったのか?」を後から知る(参照する)ことができます。(後方参照) 後方参照せずに、普通の括弧の働き、つまり単にグループ化させたいだけなら (?:~) と書きます。 =~ は、デフォルトではパターンマッチングは変数 $_ に対して行いますが、それ以外の変数に対して行いたいときに、結びつけるための演算子です。 =~ の真偽が逆になるのが !~ です。 これらはperlの基本ともいえるので、しっかり習得されてから進めることをおすすめします。

THUBAN
質問者

お礼

ありがとうございます。 $1 は後方参照用の特殊変数というのはご説明で理解できてきた感じです。 しかし、$hogehoge = $1; の表現がわかりません。 $hogehoge = $1; の場合の、$1は違う意味合いになるのでしょうか?

  • mendokusa
  • ベストアンサー率13% (359/2726)
回答No.1

この辺で↓

参考URL:
http://www.tohoho-web.com/wwwperl.htm
THUBAN
質問者

お礼

$1 は、まだ理解不透明ですが、 =~ は、理解できた感じです。 ありがとうございました。

関連するQ&A

  • Perl HTML JavaScript

    ソースコードについて <input type="hidden" id="hoge" name="hoge" value="$hensu"> このコードのvalueの値(変数)をソースから見て   見えなくさせたい(認識できなくさせたい) おそらく完全に見えなくするのは不可能と思うのですが、 valueの値をソースで見えにくくする、認識できなくする方法は ないでしょうか? 完全に見えなくできるならそれが1番いいです^^; valueの値だけjsの外部ファイルにするとかですか? その方法ですと、Valueの値はPerlでの変数なのですが、 そのようなことも可能でしょうか?

    • ベストアンサー
    • Perl
  • 『!~!』っていうのは、どのような意味

    下記のような『!url!』の『!~!』っていうのは、どのような意味なんでしょうか。 Perl Html ともに初心者です。 -------------------------------------------------------------------------------------- Perl-------------------- $tmpl =~ s/!url!/$cook[2]/; HTML------------------ <th>参照先</th> <td><input type="text" name="url" value="!url!" class="reg-url" /></td>

    • ベストアンサー
    • Perl
  • perlの文法について

    はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • htmlソースの書き換え

    UWSCで自動的にvalueに値を入れるように、以下のようなスクリプトを書いております。 IE.Document.All["hogehoge"].value = "hogehogehoge" 通常これで問題ないのですが、 参照ソースが<input name="hogehoge">で完結しており、 valueが存在しない為に値を入力する事が出来ません。 たしかjavascriptを使用して参照ソースを <input name="hogehoge" value="">に書き換えれば 値を入力する事が出来たと思うのですが、 どのようにすればよろしいでしょうか。 すみませんが、どなたか良い方法をお教えいただけないでしょうか。

  • 複数のチェックボックスの値を、ひとつの変数に入れて表示したい。

    Perlで質問です。 下記のようなフォームで、A~Fまでのチェックボックスを選んで「test.cgi」にデータを送ります。 <HTML> <BODY> <FORM action="test.cgi"> <input name="q6_1" type="checkbox" value="A">A<br> <input name="q6_2" type="checkbox" value="B">B<br> <input name="q6_3" type="checkbox" value="C">C<br> <input name="q6_4" type="checkbox" value="D">D<br> <input name="q6_5" type="checkbox" value="E">E<br> <input name="q6_6" type="checkbox" value="F">F<br> <input name="q6_7" type="checkbox" value="G">G<br> <INPUT type="submit"> </FORM> </BODY> </HTML> 次の画面で、選ばれた物の確認画面を変数「$work6」を呼び出して表示したいと思っています。 <HTML> <BODY> A / B / C / D / E / F </BODY> </HTML> この処理をperlを使ってやりたいのですが、どうやったらいいのかわかりません。 for を使って「q6_1~7」を呼び出し、それぞれの最後に「 / 」を追加したあとファイルハンドルを使って、変数「$work6」に追加上書きして表示、と言うことをすれば良いのだろうと、下記のソースを書いて見ましたが、うまくいきませんでした。 (たぶん間違いだらけだと思いますが…。) open(IN, ">>$work6"); for ($q6 = 1; $q6 < 7; $q6++){ if ($FORM{'q6_$q6'} ne '') { print IN "$FORM{'q6_$q6'}." / ""; } } close(IN); つたない質問だと思いますが、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • &って何ですか?

    perlの勉強をしています。 &abcみたいな感じで私が見ているソースコードにたくさん[&]という記号が変数を作るような形で出てくるのですが意味が分かりません。 &&や$&はわかるのですが、この変数のような形のものは分かりません。どなたかわかるかた教えていただけないでしょうか?

  • このタグの意味を教えてください

    <APPLET codeBase=/java/ height=240 width=320 code=JavaCam.class><PARAM NAME="prev_string" VALUE="atcamone"><PARAM NAME="startnumber" VALUE="1"> <PARAM NAME="endnumber" VALUE="10000"><PARAM NAME="loopdelay" VALUE="0"><PARAM NAME="number" VALUE="1"> <PARAM NAME="cust" VALUE="ted"><PARAM NAME="extension" VALUE="jpg"><PARAM NAME="interval" VALUE="1"> <PARAM NAME="url" VALUE="http://***.jpg"> <PARAM NAME="imagesource" VALUE="./images/"> <IMG SRC="http://*****.jpg" ALT="Pic"></APPLET> ある動画があってそこのソースを見たのですが ちんぷんかんぷんでした。TT できたらこのタグを詳しく教えていただけないでしょうか?またこの動画の保存方法なども教えていただけたら幸いです

    • ベストアンサー
    • HTML
  • リンク先のcgiが開かない

    お世話になります。 既存のcgiを改造しているのですが、リンク先のcgiが開かず、何のエラーもなく、元のページが再表示されてしまっています。何が原因なのでしょうか? ソース自体は改造前と見比べてみても(パラメータを追加した以外)なんら変わりはありません。 <FORM METHOD=POST ACTION="t02.cgi"> <INPUT TYPE=HIDDEN NAME=A VALUE="123"> <INPUT TYPE=HIDDEN NAME=MODE VALUE="111"> <INPUT TYPE=HIDDEN NAME=BU VALUE="DD"> <TD COLSPAN=6>&nbsp;&nbsp;<INPUT TYPE=SUBMIT VALUE="ダウンロード"></TD> </FORM> 上記のようなテキストをperlで組み立ててスキンにはめ込んで作っています。 よろしくお願いします。

    • 締切済み
    • CGI
  • .cshrcでのエラー

    シェル初心者です。 現在、さくらのレンタルサーバで.cshrcの設定を行っています。 os :FreeBSD 9.1 64bit Perl : Ver.5.8.9です。 http://d.hatena.ne.jp/perlcodesample/touch/20101027/1278596435を参考にして .cshrc内に setenv PERL5LIB /home/hogehoge/local/lib/perl5:/home/hogehoge/local/lib/perl5/site_perl:$HOME/perl5/lib/perl5:$PERL5LIB; # @@ Added by CPAN local setup tool @@ setenv PERL_CPANM_OPT="--local-lib=~/perl5"; という記述を追加しましたが % source .cshrcを実行すると setenv: Variable name must contain alphanumeric characters. というエラーが出ます。 何やら変数名をアルファベットで書けと言っているようですが、 #setenv PERL_CPANM_OPT="--local-lib=~/perl5"; というようにこの一行をコメントアウトするとエラーは出ません。 どこがまずいのでしょうか? 初歩的な質問で恐縮ですが、宜しくご教授お願いいたします。

  • 正規表現による検索

    正規表現によって文字列を検索し、該当する文字列が存在する場合には存在する旨のメッセージを出力し、存在しない場合には存在しない旨のメッセージを出力するようなプログラムを作りたいのですが現在うまくいっておりません。ソースは以下になります。 #!/usr/bin/perl $logfile = './log_euc.log'; # ログファイル @logs = &read_file($logfile); foreach $log (@logs) { if ($log = ~/hogehoge/ ){ $log_stg = " 変数に文字列hogehogeは含まれています。 "; }else{ $log_stg = " 変数に文字列hogehogeは含まれていません。 "; } print " 判定結果\n "; print " $log_stg\n "; } sub read_file { local($logfile) = $_[0]; open(IN,$logfile); local(@files) = <IN>; close(IN); return @files; } 検索対象のファイル「log_euc.log」は以下です。 hogehoge mugemuge riri ari siri siursoiu sojowijugo hfsoiehrohogehoge sjhoisjofhoge osihojfhoge hsoghsoehogehogesoijggggg 検索結果は以下です。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。

    • ベストアンサー
    • Perl

専門家に質問してみよう