frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

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 となる。便利___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++;

}

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

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

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() に引き数として数字を渡してやると、

さらにサブルーチンを追跡して、情報を返してくれる模様。

その数字が大きければ大きい程、追跡されるサブルーチン数が多くなる。