• ベストアンサー

初歩的な質問なのですが

以下の2つの関数から「内部変数」「引数」「戻り値」がどれかを知りたいのですが、 戻り値:「$esc_0208」「$esc_asc」 引数:なし であっているでしょうか? 変数は「$esc_0208」と「$esc_asc」のようにも思えるのですが、変数であり戻り値でもあるということでしょうか? sub jis_inout { $esc_0208 = shift || $esc_0208; $esc_0208 = "\e\$$esc_0208" if length($esc_0208) == 1; $esc_asc = shift || $esc_asc; $esc_asc = "\e\($esc_asc" if length($esc_asc) == 1; ($esc_0208, $esc_asc); } sub get_inout { local($esc_0208, $esc_asc); $_[$[] =~ /($re_jis0208)/o && ($esc_0208 = $1); $_[$[] =~ /($re_asc)/o && ($esc_asc = $1); ($esc_0208, $esc_asc); }

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

$esc_0208 = shift || $esc_0208; これは以下のようなことを一度にやっていると解釈してください。 # @_ (サブルーチンの引数リスト)の先頭から一つ shift (取り除いて) # $esc_0208 に代入する $esc_0208 = shift(@_); # $esc_0208 の内容が 0 || '' || undef だったら $esc_0208 の # 値を代入する $esc_0208 = $esc_0208 unless($esc_0208); また、サブルーチンなどの戻り値は最後に処理された値です。 例えば sub test { 1; } は sub test { return 1; } と同じ意味だし、 sub test { ("test", 1); } は sub test { return ("test", 1); } と同じ意味になります。 どちらかというとPerlの基本を学び直した方がよいように思います。 Perlはこういった省略記法が多く存在するので同じ事をするにも 複数の書き方があり、びっくりするようなこともあります。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

引数と戻り値については、仕様としては http://mikeneko.creator.club.ne.jp/~lab/kcode/jcode.html#h2-5 > jis_inout($b2, $b1) > この関数は、変更後のエスケープシーケンスのリスト ($b2, $b1) を返します。 > get_inout($string) > 返す値の形式は、jis_inout() と同様に、($b2, $b1) の形式です。 と書かれてるとおりです。 ○引数について ・jis_inout 関数の引数は配列「@_」に代入されてきます。 shiftは配列の左端の要素を返し、その要素を配列から削除します。配列を指定しない場合は@_を対象にします。 つまり、 > $esc_0208 = shift || $esc_0208; > $esc_asc = shift || $esc_asc; は > $esc_0208 = $_[0] || $esc_0208; > $esc_asc = $_[1] || $esc_asc; と等価です。 ・get_inout 「$_[$[]」で、$_[0] を指定したことになります。つまり、第1引数が正規表現にマッチするかどうかを調べています。詳しくは特殊変数「$[」について調べてください。 ○戻り値について perl では、return文が無い場合は、一番最後に評価した式を戻り値とします。 どちらの関数も最後に「($esc_0208, $esc_asc);」という式がありますから、このリストが戻り値になります。 ○変数について jis_inout では二つの変数「$esc_0208」「$esc_asc」が使われていますが、この変数は関数外で用意されたグローバルなものです。 関数呼び出し終了後も、その値は保持されつづけます。また、jis_inout の引数を指定しなかった場合は、保持している元の値をそのまま使っています。 get_inout の方では、二つの変数「$esc_0208」「$esc_asc」が使われていますが、この変数はget_inout関数下でのみで有効なローカルなものです。 関数が呼び出されるたびに毎回「undef」で初期化されます。 > 変数であり戻り値でもあるということでしょうか? 変数の最終的な値を、戻り値にしている、と言うことです。 例えば、 「return 1;」って文があったら、戻り値は「1」です。 「return $a+1;」って文があったら、戻り値は「$a+1」(変数$aの値に1を足したもの)です。 「return $a;」って文があったら、戻り値は「$a」(変数$aの値)です。

Zippyy
質問者

補足

jis_inout 変数:"$esc_0208"と"$esc_asc" 引数:"$_[0]"と"$_[1]" 戻り値:"$esc_0208"と"$esc_asc" get_inout 変数:"$esc_0208"と"$esc_asc" 引数:"$_[0]" 戻り値:"$esc_0208"と"$esc_asc" 以上でよろしいでしょうか?

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

なんかの課題ですかね? そうだとしたら直で答えを教えることはできないので参考になるところだけのせときます。 http://www.site-cooler.com/kwl/perl/9.htm 戻り値は上のurlの「結果の戻し」の「return を用いない場合」のところ 内部変数は「変数のスコープ」のあたり、引数は「引数の受け取り」のあたり 引数あたりのヒントとして ・shiftのあとに@_ が省略されていること ・$_[$[]のは$_[0]と同じ意味であること を、加味して自分で考えてみてください。

関連するQ&A