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 となる。便利___DASH___♪
■ハッシュの特定のキーの値だけを変更
@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++;
}
…などと、一度 @_ から他の変数に入れなおす必要がある。
■サブルーチンからの期待される戻り値を知る方法
戻り値のデータ型を明記しないので、戻り値にどんなもんが来るのか
サブルーチンの 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() に引き数として数字を渡してやると、
さらにサブルーチンを追跡して、情報を返してくれる模様。
その数字が大きければ大きい程、追跡されるサブルーチン数が多くなる。