モダンプログラマまで何光年?

Webアプリ制作周辺を漂っています。はやくHackerになりたい・・・

Encode.pmのfrom_toは破壊的メソッド

 タイトルの通りですw
 $filenameに文字コード変換後の文字列が入ることを期待して↓みたいなコード書いたら$filenameに数字が入っていて、あれ〜?ってなった。

$filename = from_to( $filename, 'UTF-8', 'shiftjis' );

 CPANのドキュメント(from_to)読んでみたら、

  [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])

 となっている。
 from_toメソッドを呼べば、引数に与えた文字列は文字コード変換がされ、返り値には変換後の文字数が入る。
 そうかそうか、破壊的なメソッドだったか〜というそれだけのお話。まぁドキュメント嫁ってことなんですが・・・


 :蛇足
 引数そのものを変換している処理がどうやってなされているのかが気になったのでソースを見てみた。
 (Encode.pm Version: 2.48

sub from_to($$$;$) {
    my ( $string, $from, $to, $check ) = @_;
    return undef unless defined $string;
    $check ||= 0;
    my $f = find_encoding($from);
    unless ( defined $f ) {
        require Carp;
        Carp::croak("Unknown encoding '$from'");
    }
    my $t = find_encoding($to);
    unless ( defined $t ) {
        require Carp;
        Carp::croak("Unknown encoding '$to'");
    }
    my $uni = $f->decode($string);
    $_[0] = $string = $t->encode( $uni, $check );
    return undef if ( $check && length($uni) );
    return defined( $_[0] ) ? length($string) : undef;
}

 下から4行目が肝心の処理。なるほど、$_[0]をいじることで、呼び出し元の値を変更してしまっているのね。
 うーん、若干気持ち悪い挙動な気もする・・^^