dポイントプレゼントキャンペーン実施中!

配列を引数とするサブルーチンに関する質問です。
Trimと Hex2Decのサブルーチンをインターネットを参考に作りました。

下記のスクリプトは
> perl test.pl
で期待通りに動きます。

質問は、サブルーチンの中における、
for (@out) {
$_=hex;
}
です。

trimの方では、$_がなくても、きちんと動きます。(あってもOK、$_=~s/^\s+//; $_=~s/\s+$//;)
Hex2Decの方は、$_=hex; でないと動きません。

これは、for (@out) { }でひとつずつ処理する対象が、$_に入っている。
処理結果の格納先が、s/^\s+//; の場合は、記述無き時は、 $_と暗黙できまっているのに対し、
hex;の場合は、そうではない。明示的に与えてやらなければいけない。
こういう理解で、良いでしょうか?

他に、やりようはあるのでしょうか?
宜しくお願いいたします。


test.pl -----------------------------------------
$a=10,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n";
$a=20,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n";

@a=('a','b','c','d');
@b=&Hex2Dec(@a);
print "Hex=@a --> Dec=@b\n";

$a=' a ',print "org=$a --> trimed =".&trim($a)."xxxxx\n";
$a=' b ',print "org=$a --> trimed =".&trim($a)."xxxxx\n";
@a=(' a ',' a ',' a ',' a ');
@b=&trim(@a);
print "org=@a --> trimed= @b\n";

sub trim {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];
}


sub Hex2Dec {
my @out = @_;
for (@out) {
$_=hex;
}
return wantarray ? @out : $out[0];
}
------------------------------------------------

A 回答 (1件)

hex は 16進数を10進数に変換した値を返します。


つまり、引数の値に変化はありませんので、
結果を受け取る必要があります。

$_ = hex は、引数の値として、$_ が使われています。
$_ = hex($_) ということになりますね。
混乱するうちは、できるだけ省略をしないことをお奨めします。
    • good
    • 0
この回答へのお礼

tamahiro22さん、ありがとうございます。
なかなか、慣れないですが、覚えてしまいます。
ありがとうございます。

お礼日時:2008/01/15 23:27

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