• ベストアンサー

ループ変数の変更

GUCIと申します。 ループ変数の変更は、元の値を変えてしまうのでしたっけ? 元を変えずに変更したい場合に、 my $data_tmp = $data; $data_tmp =~ s/^0+//; としないといけないなんて。 らくだ本読んでも解りませんでした。 どなたか、解説お願いします。 C:\>type T1.pl #!Perl use strict; my @data = qw(001 002 003); print "S1: data is @data\n"; for my $data (@data) { $data =~ s/^0+//; } print "S2: data is @data\n"; __END__ C:\>T1.pl S1: data is 001 002 003 S2: data is 1 2 3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>ループ変数の変更は、元の値を変えてしまうのでしたっけ? です。 >どなたか、解説お願いします。 らくだ本にどう書かれていたか知りませんが(忘れた)、 要は値がコピーされてるんじゃなくて別名がついてるだけなので、 別名の方をいじっても本体に影響が出ると云うことです。 If any element of LIST is an lvalue, you can modify it by modifying VAR inside the loop. Conversely, if any element of LIST is NOT an lvalue, any attempt to modify that element will fail. In other words, the "foreach" loop index variable is an implicit alias for each item in the list that you're looping over. perlsyn

guci-ok
質問者

お礼

有り難う御座います。 myしてるから、大丈夫って思ってました。 すると、元データを変えずに、ループ変数を加工して 何か処理したい場合って、解りますか? for your $data (@data) { とか、無いですよね。(^_^)ゞ

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

#3のスクリプトで5.10依存なのは say を使っていることだけなので、 そこを修正すれば前のバージョンでもokですよ。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

どういった処理をしたいのにかもよりますが、今回の例で言えば このようなやり方もあります。 #!/usr/bin/perl # -*- coding: utf8 -* use strict; use warnings; use Fatal qw(:void open close); use feature ':5.10'; my @data = qw(001 002 003); say "S1: data is @data"; say "S2: data is ", join($", map {$_+0} @data); =begin for my $data (@data) { $data =~ s/^0+//; } =cut say "S3: data is @data"; 結果: S1: data is 001 002 003 S2: data is 1 2 3 S3: data is 001 002 003 S3での結果を見ると分かるとおり、元データは変わってません。

guci-ok
質問者

お礼

有り難う御座います。 でも、 5.10 には付いていけないです。

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

>すると、元データを変えずに、ループ変数を加工して >何か処理したい場合って、解りますか? それがコピーでしょう? コピーするのがいやなら (理由はまったく分からないけど), localで変更をスコープの中に押し込める。 いや,myされた変数はローカルできないから, myせずにごまかすとか・・・ use strict; my @data = qw(001 002 003); print "S1: data is @data\n"; {no strict "vars"; for $data (@data) { local $data; $data =~ s/^0+//; } } print "S2: data is @data\n"; __END__ ・・・いやなコードだと思う. コピーするのがいやなら,参照渡しの サブルーチンの引数も コピーせずにやっちゃってる?

guci-ok
質問者

お礼

・・・ですか。 やっぱり、 for your $data (@data) { じゃないかと。 my より、さらに刹那的な形容詞ってないかしら。