プロが教える店舗&オフィスのセキュリティ対策術

以下の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);
}

A 回答 (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はこういった省略記法が多く存在するので同じ事をするにも
複数の書き方があり、びっくりするようなこともあります。
    • good
    • 0

引数と戻り値については、仕様としては


http://mikeneko.creator.club.ne.jp/~lab/kcode/jc …
> 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の値)です。

この回答への補足

jis_inout
変数:"$esc_0208"と"$esc_asc"
引数:"$_[0]"と"$_[1]"
戻り値:"$esc_0208"と"$esc_asc"

get_inout
変数:"$esc_0208"と"$esc_asc"
引数:"$_[0]"
戻り値:"$esc_0208"と"$esc_asc"

以上でよろしいでしょうか?

補足日時:2008/07/10 20:41
    • good
    • 0

なんかの課題ですかね?



そうだとしたら直で答えを教えることはできないので参考になるところだけのせときます。

http://www.site-cooler.com/kwl/perl/9.htm

戻り値は上のurlの「結果の戻し」の「return を用いない場合」のところ
内部変数は「変数のスコープ」のあたり、引数は「引数の受け取り」のあたり
引数あたりのヒントとして
・shiftのあとに@_ が省略されていること
・$_[$[]のは$_[0]と同じ意味であること

を、加味して自分で考えてみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!