作者: KAWAI,Takanori
日時: 2004/5/2(17:18)
川合孝典です。

----- Original Message ----- 
From: "藤岡和夫" <kazuf@...>
To: <TSperl@...>
Sent: Sunday, May 02, 2004 3:53 PM
Subject: [TSperl:371] for と foreachの違い


> @flds = ("","a","b",0,1,2);
> for($i=0;$i<=$#flds;$i++){
>     if($flds[$i]){
>         print $flds[$i], "\n";
>     }
> }
> foreach (@flds){
>     if($flds[$_]){
>         print $flds[$_], "\n";
>     }
> }
>
> 結果は、
(中略)
> のようになるのですが、なぜ?
どのような結果をお望みでしょう?

まずPerlではforとforeachは同じもの(The foreach keyword is
actually a synonym for the for keyword)なので、反対にしても
変わりはありません。

 @flds = ("","a","b",0,1,2);
 foreach($i=0;$i<=$#flds;$i++){
     if($flds[$i]){
         print $flds[$i], "\n";
     }
 }
 for (@flds){
     if($flds[$_]){
         print $flds[$_], "\n";
     }
 }

結果のうちa,b,1,2は上のループ、続くa,bは下のループで
出力されています。
上のループは@fldsを順に出力していきますが、値がtrueと
判定されない""と0が出力されません。
また下のループでは$_に配列の値が入ります。
そのため$fld[$_]と配列の指定して有効になるケース0,1,2のうち、
0の場合には値がtrueと判定されないために1、2の値である
a,bが出力されています。

私がforeachで上のループを書くなら、こんな感じかなと。
  foreach my $sItem (@flds){
    print $sItem, "\n" if($sItem);
  }

===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr@... GCD00051@...
   http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
perldocの日本語情報ならperldocjp:翻訳してみませんか?
  http://perldocjp.sourceforge.jp/
===================================================