Perl小技集1
[HOME] [BACK] [NEXT]まとまり無いんですがここではよく使う小技を取り上げていきます。どれもDBMS周りのコードを効率良く書く上でよく使っています。
1.処理部を制御文の前に書く
一部の制御文では処理部を制御文に前置できます。以下の最後の例はCのswitch文を エミュレートするのに便利です。またこの場合制御文の小カッコは省略できます。
return(1) if $vr eq 'ABC';
print( "Aho !" ) if $name eq 'Baka';
$flag = 1;
{
print( "ABC\n" ) , last if $flag == 1;
print( "DEF\n" ) , last if $flag == 2;
print( "Error!!\n" );
}
2.参照(Reference)とは
これを説明しないと話しを先に進められないので簡単に解説しておきます。 Perl4以前には参照や多次元配列の概念が無かったそうです。私がPerlを始めた時は既にVersion5だったので当然の様に使ってますが。。 Perlの参照にはCのポインターと同等の固定参照とシンボリック参照が有ります。参照は参照元の実体では無くて、格納アドレスと型情報(固定参照)や変数名(シンボリック参照)を保持しています。どちらも逆参照する事で参照元のデータにアクセスできます。 以下参照の作成と逆参照例です。参照は全てスカラーになります。固定参照は変数名に\記号を付ける事で作成します。逆参照するには参照スカラー変数名の前に、参照元変数の変数識別子($や@)を付けます。
# 固定参照
$vr1 = 1;
$vr1_reference = \$vr1;
@ar = ('a','b','c');
$ar_reference = \@ar;
# シンボリック参照
$vr2 = 2;
$vr2_name = "vr2";
##
print "$$vr1_reference\n","$$vr2_name\n";
print "@$ar_reference\n";
---------------------------------
1
2
abc
3.無名配列、無名ハッシュと逆参照演算子(->)
無名配列構成子[]を使うと無名配列という名前の無い配列を参照を使って作れます。 無名ハッシュ構成子{}を使うと無名ハッシュという名前の無いハッシュを参照を使って作れます。 また、配列、ハッシュ、サブルーチンへの参照に対して特定のインデックス、キー、 引数リストを指定したいときは、->という逆参照演算子を使うこともできます。
$ar_ref = ['a','b','c'];
$hs_ref = {
key1 => 'k1',
key2 => 100,
};
print "===Array===\n";
print $ar_ref->[1],"\n";
print $$ar_ref[1],"\n";
print "===Hash===\n";
print $hs_ref->{key1},"\n";
print $$hs_ref{key2},"\n";
$hs_ref = { key1,'k1',key2,100};
print $hs_ref->{key1},"\n";
print $$hs_ref{key2},"\n";
$k1='key1';
$k2='key2';
print $hs_ref->{$k1},"\n";
print $$hs_ref{$k2},"\n";
---------------------------------
===Array===
b
b
===Hash===
k1
100
k1
100
k1
100
無名配列が便利に使えるのは後で説明する多次元配列と""の中に関数の結果やサブルーチンの戻り値を直接記述したい時です。以下はよくやるミスです。
@ar = ( 'a','b','c' );
$xx="です";
print "join(':',@ar)$xx";
---------------------------------
join(':',@ar)です
print文の""の中でjoin関数の結果を要素数1個の無名配列にしてその参照を{}でブロック化した後逆参照すれば以下の様に正しく表示されます。
@ar = ( 'a','b','c' );
$xx="です";
print "@{[join(':',@ar)]}$xx";
---------------------------------
a:b:cです
4.多次元配列を使いこなす
Perl5からは多次元配列が使えます。といっても例えば2次元配列は他の配列への参照を保持している配列にすぎない事に注意が必要です。2次元配列の要素に代入する以下の2つの文は同じ事です。 後者は逆参照演算子->を省略しないで書いた場合です。
$ar[0][1] = 1; $ar[0]->[1] = 1;
2次元配列の作り方1(無名配列構成子[]を使う)
$ar[0] = [0,2]; $ar[1] = [1,3]; print $ar[0][1]; -------------------- 2
2次元配列の作り方2(配列参照のリストを使う)--わかりやすいのでお気に入り--
@ar = ( ['えんぴつ','シャープペン'], ['消しゴム','インク消し'], ); print $ar[0][1]; -------------------- シャープペン
また以下の様に多次元配列名をprint文で指定しても、アドレス情報を保持している参照そのものが出力されてしまいます。
$ar[0] = [0,2]; $ar[1] = [1,3]; print @ar; -------------------- ARRAY(0x734928)ARRAY(0x739368)
以下の様に配列参照を逆参照するには@{}を使います。
$ar[0] = [0,2];
$ar[1] = [1,3];
print @{$ar[1]};
--------------------
13
2次元配列の作り方3(配列参照の逆参照を使う)--わかりにくいですね--
@{$ar[0]} = (0,2);
@{$ar[1]} = (1,3);
print $ar[1][1];
--------------------
3