2005年5月22日

perlな基礎。

図書館で借りた本を爆読中、あに山です(^^;

「オブジェクト指向Perlマスターコース」の方に
perl入門なる項目があるんだけど
これが結構すんばらしい内容で、
いちいち「すげー!」って
感動しながら読んでしまいました(笑)

まだ読んでる途中なんだけど
新たに確認したperlの機能について、メモりまーす。

■サブルーチンの引き数

サブルーチン呼び出し時に &サブルーチン名 と書くと
引き数を指定しない場合、
呼び出し時に @_ に入っている値が勝手に引き数となる。

@_ = qw( aaa bbb ccc );
&test; # 引き数を指定しないで&testを呼び出す

sub test {
my ( $a, $b, $c ) = @_;
print "${a}\n";
print "${b}\n";
print "${c}\n";
}


結果
aaa
bbb
ccc


■サブルーチンの呼び方

&サブルーチン名 と今まで書いてたけど
すでに呼び出す手前に、定義されているサブルーチンは
&をつけなくても、呼び出す事が出来る。


■配列に配列を挿入する方法


my @aaa = qw( aaa bbb ccc );
my @bbb = qw( 111 222 333 );
splice @aaa, 2, 0, @bbb;

こうすると、結果は…
aaa bbb 111 222 333 ccc
…になる。


■配列の最後を指定する方法

$aaa[-1];
$aaa[$#aaa];


■配列の中身を単純に並べてプリントする方法


print ( @aaa );


■リストを配列に入れる方法


my @aaa = qw( aaa bbb ccc );


■配列をリストに入れる方法


my ( $a, $b, $c ) = @aaa;


■ハッシュの内容をforeachじゃなくてwhileでチェックする方法

while( defined ( $key = each %aaa ) ) {
print "${key} => ${aaa{$key}}\n";
}

while( ( $key, $value ) = each %aaa ) ) {
print "${key} => ${value}\n";
}


■ハッシュの特定のキーの値だけを取得する方法

my %aaa = (
aaa => "111",
bbb => "222",
ccc => "333",
ddd => "444",
eee => "555"
);
@aaa{ qw( bbb ccc eee ) };

結果は 222333555
ちなみに…

join ",", @aaa{ qw( bbb ccc eee ) };

…とやれば、結果は 222,333,555 となる。便利~♪


■ハッシュの特定のキーの値だけを変更

@aaa{ qw( bbb ccc eee ) } = qw( BBB CCC EEE );

@aaa と書いてあるのに、ハッシュなのがポイント。
qwで指定しているキーだけが、右側のqwの値に入れ替わり…

$aaa{bbb} = "BBB";
$aaa{ccc} = "CCC";
$aaa{eee} = "EEE";

…を実行したのと同じ状態になる。


■サブルーチン内の@_ は引き数のコピーではなく別名扱い

my $aaa = 0;
for( 1..5 ) {
&addNum( $aaa );
print "${aaa},";
}
exit;

sub addNum {
$_[0]++;
}

この結果は、1,2,3,4,5, となる。
サブルーチンへの引き数をコピーさせるには
よく通常書いているように…

sub addNum {
my $a = @_;
$a++;
}

…などと、一度 @_ から他の変数に入れなおす必要がある。


■サブルーチンからの期待される戻り値を知る方法

Javaと違って perl はサブルーチンの頭に
戻り値のデータ型を明記しないので、戻り値にどんなもんが来るのか
サブルーチンの return の部分を見ないとわからん訳ですが。

逆に呼び出し側で期待している、戻り値のデータ型にあわせて
サブルーチン側で戻り値を変更する事が可能らしい。

my $aaa = &test(); # スカラーの戻り値を期待
my @aaa = &test(); # リストの戻り値を期待
my ( $aaa, $bbb ) = &test(); # 同じくリストの戻り値を期待
print ( &test() ); # 同じくリストの戻り値を期待
&test(); # 戻り値なし

これに対応したサブルーチンを作るには…

sub test {
my $returnType = wantarray();
if ( $returnType == 1 ) {
# リストの戻り値
return qw( aaa bbb );
} elsif ( defined( $returnType ) ) {
# スカラーの戻り値
return "aaa";
} else {
# 戻り値なし
}
}

…とすれば良い模様。
wantarray() なんて関数があるんだね。知らんかった。


■サブルーチンの呼び出し元情報を返す方法

caller() 関数をサブルーチン内で使うと
そのサブルーチンを呼び出した、
パッケージ名、ファイル名、ファイルの中の行数
が返される。

サブルーチンから、さらにサブルーチンを呼んでたりする場合も
最初の呼び出し元のパッケージ名等を返すから
だいたいの場合、パッケージ名は main になると思われる。

main 以降、どこのサブルーチンを辿ったのか調べるには
caller() に引き数として数字を渡してやると、
さらにサブルーチンを追跡して、情報を返してくれる模様。
その数字が大きければ大きい程、追跡されるサブルーチン数が多くなる。

Posted by anigon at 12:00 AM

「ハイジまにあ。」へ戻る | 「perlな基礎2。」へ進む

上へ戻る