参照渡しじゃなくても中で変更できるのかあ
2006-11-28-3
[Programming]
Perl の話。
関数の引数でリファレンス渡しでなくても、
関数内部でその変数の値を直接変更できちゃうのかあ。
Encode の from_to で、使われていた方法で、
ちょっとローカルで話題になった。
以下、実験してみたスクリプト:
「Perl ベストプラクティス」より(p.194):
述べられているので、 $_[0] を変更するような方法は推奨されてない。
「参照渡しでない引数が関数実行後に変更されている」というのは
違和感を感じる、というかトラブルの元だと思う。
なるべくやらないようにしよっと。
参考:
- Perl ベストプラクティス
- Google Code Search : "$_[0] = "
- perldoc Encode
関数の引数でリファレンス渡しでなくても、
関数内部でその変数の値を直接変更できちゃうのかあ。
Encode の from_to で、使われていた方法で、
ちょっとローカルで話題になった。
以下、実験してみたスクリプト:
#!/usr/bin/perl use strict; use warnings; my $status = "hello"; print "$status\n"; happy(\$status); print "$status\n"; tired($status); print "$status\n"; sub happy { my ($s_ref) = @_; $$s_ref = "lucky"; } sub tired { $_[0] = "goodbye"; }
「Perl ベストプラクティス」より(p.194):
@_ の各要素が元の引数のエイリアスであることは忘れられがちである。「Perl ベストプラクティス」では「常に、まず @_ を展開する」と
つまり、$_[0] を変更すれば、その変数を包含している変数を変更するこ
とになる。
述べられているので、 $_[0] を変更するような方法は推奨されてない。
「参照渡しでない引数が関数実行後に変更されている」というのは
違和感を感じる、というかトラブルの元だと思う。
なるべくやらないようにしよっと。
参考:
- Perl ベストプラクティス
- Google Code Search : "$_[0] = "
- perldoc Encode
この記事に言及しているこのブログ内の記事