アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

>ループ変数の変更は、元の値を変えてしまうのでしたっけ?



です。

>どなたか、解説お願いします。
らくだ本にどう書かれていたか知りませんが(忘れた)、
要は値がコピーされてるんじゃなくて別名がついてるだけなので、
別名の方をいじっても本体に影響が出ると云うことです。

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
    • good
    • 0
この回答へのお礼

有り難う御座います。
myしてるから、大丈夫って思ってました。

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

お礼日時:2008/09/10 13:05

#3のスクリプトで5.10依存なのは say を使っていることだけなので、


そこを修正すれば前のバージョンでもokですよ。
    • good
    • 0

どういった処理をしたいのにかもよりますが、今回の例で言えば


このようなやり方もあります。

#!/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での結果を見ると分かるとおり、元データは変わってません。
    • good
    • 0
この回答へのお礼

有り難う御座います。

でも、 5.10 には付いていけないです。

お礼日時:2008/09/11 23:23

>すると、元データを変えずに、ループ変数を加工して


>何か処理したい場合って、解りますか?

それがコピーでしょう?

コピーするのがいやなら
(理由はまったく分からないけど),
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__
・・・いやなコードだと思う.

コピーするのがいやなら,参照渡しの
サブルーチンの引数も
コピーせずにやっちゃってる?
    • good
    • 0
この回答へのお礼

・・・ですか。

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

お礼日時:2008/09/11 23:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!