質問: $data."_suffix"; } とした場合、foreach{}内で処理した値を、foreach{}の外で使いたい場合 どのように書けばよいのか、ご教授願えないでしょうか。 上記の場合だと$hensuはforeach{}のスコープでしか使えないと思いますが、 そもそも論、perlのforeachは連番出力などprint ...や三項演算子などを 使う場合だけでしか使わない、又は使ってはいけないもの、なのでしょうか? 配列のmax要素数を計って、for文で回せばいいのかもしれませんが、 foreachの性格を知っておきたく、また可能なら処理したものを外で使えるものなら 手段をしっておきたく質問させていただきました。 以上、よろしくお願いいたします。
回答: 何か微妙に勘違いがあるようです。perlのforとforeachには本質的な違いはありません。たとえば次の4行はすべて同じように機能します。 ``` foreach $i (0..10){print "$i\n"} for $i (0..10){print "$i\n"} foreach($i=0; $i<=10; $i++){print "$i\n"} for($i=0; $i<=10; $i++){print "$i\n"} ``` $hensuへのアクセスはそこにforeachがあるから可能になるとかならないとかいう話ではありません。ブロックとスコープの問題です。言い方を変えるとfor/foreachよりも{}の存在が重要です。 次のスクリプトは、ブロックだけを使ってスコープのありようを試験してみた例です。 ``` #!/usr/bin/perl my $i=1; my $j=2; { my $j=10; #myをつけているので、この$jは外の$jとは別物 my $k=20; $i++; # この$iは外で定義されている$i print "in: i=$i\n"; print "in: j=$j\n"; print "in: k=$k\n"; } print "out: i=$i\n"; print "out: j=$j\n"; print "out: k=$k\n"; ``` 実行結果はこうなります。 ``` in: i=2 in: j=10 in: k=20 out: i=2 ←ブロック内での演算結果が外でも反映されている out: j=2 ←ブロック内での演算結果は外では関係ない out: k= ←$kはブロック内でmy定義されているのでブロックの外には存在しない(未定義) ```