mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

perlで一つのサブルーチンでlistかscalarを返すようにする

Net::Telnetライブラリを使用したとき、cmdサブルーチンがscalarとlistを返却する記載になっており、返却されるデータも全く別物なのが気になったので調べてみた。
Net::Telnet->cmdメソッドのリファレンスはこんな内容。

cmd - issue command and retrieve output
    $ok = $obj->cmd($string);
    $ok = $obj->cmd(String   => $string,
                    [Output  => $ref,]
                    [Cmd_remove_mode => $mode,]
                    [Errmode => $mode,]
                    [Input_record_separator => $chars,]
                    [Ors     => $chars,]
                    [Output_record_separator => $chars,]
                    [Prompt  => $match,]
                    [Rs      => $chars,]
                    [Timeout => $secs,]);

    @output = $obj->cmd($string);
    @output = $obj->cmd(String   => $string,
                        [Output  => $ref,]
                        [Cmd_remove_mode => $mode,]
                        [Errmode => $mode,]
                        [Input_record_separator => $chars,]
                        [Ors     => $chars,]
                        [Output_record_separator => $chars,]
                        [Prompt  => $match,]
                        [Rs      => $chars,]
                        [Timeout => $secs,]);

どうやって実現してるのか調べてみたら、cmdサブルーチンの処理の最後はこんな処理だった

wantarray ? @$output : 1;

このページによると、wantarrayとは、

実行中のサブルーチンの戻り値として、リストが要求されている場合に真を返し、スカラーが要求されている場合には偽を返します。

というものだそうな。
覚えておこう。