Posts
Perl の reverse 関数にやられる
Perl で文字を反転したかったので、以下のようなコードを書いたが文字が反転しない。
sub my_print { print $_[0]; } my_print(reverse('1234'));
まったく原因が掴めなかったが、perldoc と睨めっこをしてやっと気がついた。
リストコンテキストでは、LIST を構成するよ要素を逆順に並べたリスト値を返します。スカラコンテキストでは、LIST の要素を連結して、全ての文字を逆順にした文字列を返します。
reverse はスカラもリストも両方食べてしまう関数なので、受取側の型指定によって挙動が変化する。
Perl は引数を配列として扱うので、関数の戻り値をそのまま引数として渡そうとすると配列が要求されたと思い、要素の位置を逆にした配列を返してしまう。もちろん 1 要素なので昇順も降順も関係ない。
めんどくさくなってきたので、カッとなって関数を書いた。
sub strrev { return scalar(reverse($_[0])); } my_print(strrev('1234'));
これなら間違えることもないだろう。