foreachのワーク変数には参照が入る!!

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-09-05 foreachのワーク変数には参照が入る!!

配列変数をforeachで処理するときに、配列変数の要素をワーク変数(下のサンプルでは$value)へ格納しますが、これには、値でなく参照が入ります。


ですので、ワーク変数を編集すると、実は配列変数の要素を編集することになり、思わぬ結果が生じることがあるのです(経験者は語る)。


以下のNo.1では、@Nameの要素に対して、文字列『<br>』が外側のループ毎に一つ多く付加される(想定外)。


これを避けるためには、No.2のように一時変数にsubstr(元の値をコピー)して、その一時変数に対して、文字列『<br>』を付加します。


サンプル No.1
use strict;
use warnings;

print '◆No.1 foreachのワーク変数$valueをそのまま使う', "\n";
my $Name = "";
my @Name = ('aaaa(10)', 'bbbb(11)', 'cccc(12)', 'dddd(13)');
for (my $i = 0; $i < 3; $i++) {
    foreach my $value (@Name) {
        $value =~ s/(^.*)(\(.*$)/$1<br>$2/; # ワーク変数$valueの内容を編集する
        $Name = $Name . "<th>$value</th>";
    }
}
print $Name, "\n";
処理結果 No.1(ループ毎に『<br>』が一つ多く付加されてしまう[異常])
C:\Documents and Settings\koike>perl No1.pl
◆No.1 foreachのワーク変数$valueをそのまま使う
<th>aaaa<br>(10)</th><th>bbbb<br>(11)</th><th>cccc<br>(12)</th><th>dddd<br>(13)<
/th><th>aaaa<br><br>(10)</th><th>bbbb<br><br>(11)</th><th>cccc<br><br>(12)</th><
th>dddd<br><br>(13)</th><th>aaaa<br><br><br>(10)</th><th>bbbb<br><br><br>(11)</t
h><th>cccc<br><br><br>(12)</th><th>dddd<br><br><br>(13)</th>

サンプル No.2
use strict;
use warnings;

print '◆No.2 foreachのワーク変数$valueをsubstrして使う', "\n";
my $Name = "";
my @Name = ('aaaa(10)', 'bbbb(11)', 'cccc(12)', 'dddd(13)');
my $tmp_value;
for (my $i = 0; $i < 3; $i++) {
    foreach my $value (@Name) {
        $tmp_value = substr($value, 0); # ワーク変数内の参照の元の値を一時変数にコピーする
        $tmp_value =~ s/(^.*)(\(.*$)/$1<br>$2/; # 一時変数の内容を編集する
        $Name = $Name . "<th>$tmp_value</th>";
    }
}
print $Name, "\n";
処理結果 No.2(こちらは、ループしても必ず一つのみ付加される[正常])
C:\Documents and Settings\koike>perl No2.pl
◆No.2 foreachのワーク変数$valueをsubstrして使う
<th>aaaa<br>(10)</th><th>bbbb<br>(11)</th><th>cccc<br>(12)</th><th>dddd<br>(13)<
/th><th>aaaa<br>(10)</th><th>bbbb<br>(11)</th><th>cccc<br>(12)</th><th>dddd<br>(
13)</th><th>aaaa<br>(10)</th><th>bbbb<br>(11)</th><th>cccc<br>(12)</th><th>dddd<
br>(13)</th>

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう