Seaside Laboratory

Post

Perl の reverse 関数にやられる

Perl で文字を反転したかったので、以下のようなコードを書いたが文字が反転しない。

sub my_print
{
    print $_[0];
}

my_print( reverse( "1234" ) );

まったく原因が掴めなかったが、関数リファレンスと睨めっこをしてやっと気がついた。

リストコンテキストでは、list を構成するよ要素を逆順に並べたリスト値を返します。
スカラコンテキストでは、list の最初の要素のバイト順序を逆順にした文字列を返します。

reverse はスカラもリストも両方食べてしまう関数なので、受取側の型指定によって挙動が変化する。

Perl は引数を配列として扱うので、関数の戻り値をそのまま引数として渡そうとすると配列が要求されたと思い、要素の位置を逆にした配列を返してしまう。もちろん 1 要素なので昇順も降順も関係ない。

めんどくさくなってきたので、カッとなって関数を書いた。

sub strrev
{
    return scalar( reverse( $_[0] ) );
}

my_print( strrev( "1234" ) );

これなら間違えることもないだろう。