古い記事
ランダムジャンプ
新しい記事
Perl の話。
関数の引数でリファレンス渡しでなくても、
関数内部でその変数の値を直接変更できちゃうのかあ。
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):
@_ の各要素が元の引数のエイリアスであることは忘れられがちである。
つまり、$_[0] を変更すれば、その変数を包含している変数を変更するこ
とになる。
「Perl ベストプラクティス」では「常に、まず @_ を展開する」と
述べられているので、 $_[0] を変更するような方法は推奨されてない。

「参照渡しでない引数が関数実行後に変更されている」というのは
違和感を感じる、というかトラブルの元だと思う。
なるべくやらないようにしよっと。

参考:
- Perl ベストプラクティス
- Google Code Search : "$_[0] = "
- perldoc Encode
この記事に言及しているこのブログ内の記事