Seaside Laboratory

Posts

Perl の reverse 関数にやられる

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

sub my_print
{
    print $_[0];
}

my_print(reverse('1234'));

なかなか原因が掴めなかったが、perldoc と睨めっこをしてやっと気がついた。

リストコンテキストでは、LIST を構成するよ要素を逆順に並べたリスト値を返します。スカラコンテキストでは、LIST の要素を連結して、全ての文字を逆順にした文字列を返します。

reverse はスカラもリストも両方食べてしまう関数なので、受取側の型指定によって挙動が変化する。Perl は引数を配列として扱うので、reverse の戻り値をそのまま引数として渡すと配列が要求されたという扱いになり、要素を逆順に並べ替えたものを返すが、要素はひとつしかないので何も変わらず文字も反転しない。

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

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

my_print(strrev('1234'));

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