CGI-BBS > CGI > Perl > 「$_」について


カレッヂ
カレッヂ


質問者 なで  投稿日 1/11(木) 17:02:05
またまた質問にきましたが、表題以外にも、質問があるのです。。。。。
すいません。

1)「$_」について
私が調べた限りでは、
『「$_」は、特に変数名を指定しない時に、
代わりとして使われる特殊変数』

<たとえば。。。。。
 foreach (@list){ print $_; }
   配列「@list」に登録されている要素が
   一つずつ省略されたスカラー変数に格納され、
   printするときに、その省略されたスカラー変数を
   「$_」と表している。

って感じで、使われる事が分かったんです。
(あってますよねぇ〜??????)

が、次の様な場合は、
「$_」は何の変数が省略されたものなのでしょうか?

1.  foreach $list (@list) {
2.      @data = ();
3.      @key = split(/\,/,$list);
4.      foreach $key (@key) {
5.          @num = split(/,/,$TBL{'$and'});
6.          last if (@num eq "0");
7.          if (@result eq "0") {
8.              @result = @num;
9.              next;
10.         }
11.         %MARK = ();
12.         grep($MARK{$_}++, @result);
                       ↑これ
13.         @result = grep($MARK{$_}, @num);
                    ↑これ
14.         last if (@result eq "0");
15.     }
16.  }      

2)また、2行目 & 11行目の「=()」で、
 左辺には何が入るのでしょうか?

3)それと、もう一つ… (あつかましくってすいません)
6行目と7行目のif文の使い方が違うのは、どうしてでしょうか?
内容の意味は、同じだと理解してるのですが、
あってるんでしょうか?

もう、質問盛りだくさんで、すいません。

1)って分かりますかね?
ソース自体をよんでくれぇ〜!って感じになってしまったんですけど… 
ホントすいません。
あぁ、誤ってばっかりだけど、ホントすいません。

私、文章力ないので、理解できたらで結構なので、
よろしくお願いします。
回答者 しあわせのツボ  [削除]  投稿日 1/11(木) 19:47:06
1)
ちょっとパスさせて下さい。わかる方、フォローお願いします(^^;
2)
()は「空のリスト」になります。
左辺の変数の内容をクリアするのによく使われます。
3)
どちらでも同じです。読みやすさ・書きやすさ・気分等で使い分けて下さい。
(私はif内の処理が1文なら後付、2文以上かelseが続く時は前付にしています)
質問者 なで  [削除]  投稿日 1/12(金) 09:57:17
回答、ありがとうございました。

(2),(3)に関しては、理解できました。
(1)は、もう少し、調べてみます。
(っていうか、質問の仕方がまずかったですか??? それなら、すいませぇ〜ん。)

で、それとは、別にまた質問が出てきてしまいました。

12行目の「grep」のところに関して、疑問が…
というのは、私の知識のなかでは、
  @foo = grep(!/^#/, @bar);
って感じで、
  要素 = grep(式,値リスト)
だと理解していたのですが…
これは、左辺側が なぁぁ〜いぃぃぃぃ〜。
という事は、
  grep($MARK{$_}++, @result);
の処理は何を意味しているのでしょうか?

また、同じような形のものを良く見かけるのですが…
 『@date;』とか、『%data;』とか、『$data;』というように、
 言い切りで書いてあったんです。
これも同じようにつかわれてるんでしょうか?

  sub AAA {
     open (FH,"aaa.txt");
     @list=<FH>;
     foreach $line (@list) {
       if ($line=~ /^$input/){
          push(@data,$line);
       }
     }
     @data;
     ↑これ
  }

こんな感じであったんです。
上手く伝わったでしょうかね?

すいません。ヘンなことばっかり質問して…
よろしくお願いします。



回答者 しあわせのツボ  [削除]  投稿日 1/12(金) 11:54:55
一般に、左辺がないのは「その結果を必要としない」からです。
例の場合、$MARK{$_}++ の処理だけが必要で、grepされた配列は使わないので代入する変数を指定しない、ということだと思います。
たとえば、よく見る s/a/b/g; も、実は $match = s/a/b/g; とすると、置換された数が$matchに入ります。
それを必要としないことが多いので、左辺のない方が見慣れてるだけのことで。

サブルーティンの最後に変数だけが書いてあるのは、明示的に返り値を指定するものです。
例の場合、どこかで @array = &AAA(); と書くと、sub AAA内の@dataの値が@arrayに入ります。
サブルーティンを「自作の関数」と考えればわかりやすいでしょうか。
質問者 なで  [削除]  投稿日 1/12(金) 16:32:10
いつも、分かりやすい回答をありがとうございます。

ちょっと、つっかえが取れた感じです。
これで、落ち着いて週末を迎えられます。
ありがとうございます。

また、よろしくお願いいたします。

このページは終了したので返信(回答)は書きこめません

Web裏技