Perlのおぼえがき。Debina etchで動かし中。
(制作中。わからないところ多し。間違いが有る可能性大。)
Perlでは、大文字と小文字の区別がある。
$para = "aa"; # この3つの変数 $para, $Para, $PARAは違うもの。 $Para = "bb"; # $PARA = "cc"; #
# の右がコメントとみなされる。
# ここはコメント $para = 1 # ここもコメント
1行の文字数は無制限?プログラムは一行目以外改行しなくてもいいかも?でも見にくい。
#!/usr/bin/perl $para1 = "aa"; $para2 = "bb"; print "$para1$para2\n"; exit;
Hello World!!を表示する。
ファイル名: hello.pl |
---|
#!/usr/bin/perl print "Hello World!!\n"; exit; |
上記の内容のファイルを保存したら、端末でhello.plのあるディレクトリに移動し、以下のコマンドを実行。
$ chmod u+x hello.pl # 実行権限を追加。 $ ./hello.pl # 実行。 Hello World!!
メモ1) \nは改行を表す。
メモ2) プログラム一行目の #!/usr/bin/perl はコードを解釈するプログラム(インタープリター)であるperlがある場所を示している。この行を書かないとエラーになる。perlのある場所の確認は、以下のコマンドを実行。
$ which perl /usr/bin/perl
以下の方法でもHello World!!できる。
ファイル名: hello2.pl |
---|
print "Hello World!!\n"; exit; |
上記の内容のファイルを保存したら、端末でhello2.plのあるディレクトリに移動し、以下のコマンドを実行。
$ perl hello2.pl # 実行。 Hello World!!
変数は主に三種類。スカラー変数と、配列変数、連想配列変数。
$par = "aa"; # スカラー変数 $par に文字列 aa を代入。 @arr = ("aa", "bb", "cc"); # 配列変数 @arr に3つの文字列を代入。 %ass = ("key1"=>"val1","key2"=>"val2"); # 連想配列 %ass にkey1とval1、key2とval2をセットにして代入。
変数の中身を見るときは、以下のようにする。
ファイル名: test1.pl |
---|
#!/usr/bin/perl $par = "aa"; @arr = ("aa", "bb", "cc"); %ass = ("key1"=>"val1", "key2"=>"val2"); print "$par\n"; # $par の中身"aa"を表示。\nは改行を表す。 print "@arr\n"; # @arr の中身"aa bb cc"を全部表示。 print "$arr[0]\n"; # @arr の0番目の要素"aa"を表示。 print "$arr[1]\n"; # @arr の1番目の要素"bb"を表示。 print "$arr[2]\n"; # @arr の2番目の要素"cc"を表示。 print "$ass{"key1"}\n"; # %ass の"key1"に対する値"val1"を表示。 exit; |
実行結果 |
---|
$ chmod u+x test1.pl $ ./test1.pl aa aa bb cc aa bb cc val1 |
Perlでは、変数の宣言はしなくても良い。また、整数型、実数型、文字列型の違いがあいまい?変数は時と場合により、整数、実数、文字列を格納する。よって、変数の型が変わるように見える。
ただし、use strict;を書いたときは、宣言が必要。
変数名の頭文字はa〜zとアンダーバー(_)が使える。頭文字以外は、数字やアンダーバー(_)が使える。
$season ! OK $spring_8 ! OK $autumn2winter ! OK $_summer ! OK $4seasons ! NG
変数名は割りと長くても大丈夫かも。100文字の変数名が使えた。
スカラー変数には、整数、実数、文字列などの異なる型のものを格納できる。
$par1 = 100; # スカラー変数 $par1 に整数 100 を代入。 $par2 = 3.1415; # スカラー変数 $par2 に実数 3.1415 を代入。 $par3 = "aa"; # スカラー変数 $par3 に文字列 aa を代入。
スカラー変数の型は演算により変わる。
$par1 = 100; $par2 = 3.1415; $par3 = "aa"; $par1 = $para1 * 2.7182; # $par1 に 実数 271.82 が代入される。 $par2 = 50; # $par2 に 整数 50 が代入される。 $par3 = $para3 . "bb"; # $par3 に 文字列 aabb が代入される。 「.」は文字列を結合させる演算子。 $par3 = $par1 . $para2; # $par3 に 文字列 271.8250 が代入される。
文字列の表し方にもいろいろある。
$par1 = "aa"; # 文字列をあらわすには、ダブルクオートを用いる。 $par2 = 'bb'; # シングルクオートでもよい。 $par3 = 'string "aa"'; # ダブルクオート自身をあらわすには、シングルクオートの中で用いる。 $par4 = "string 'bb'"; # シングルクオート自身をあらわすには、ダブルクオートの中で用いる。 $par5 = "string \"aa\""; # ダブルクオートのなかで、ダブルクオートを表したいときは、\を用いる。 $par6 = 'string \'bb\''; # シングルクオートの時も同じ。 $par7 = "$par1$par2"; # ダブルクオートの中では、変数は展開される。この場合、文字列 aabb が代入される。 $par8 = '$par1$par2'; # シングルクオートの中では、変数は展開されない。この場合、文字列 $par1$par2 が代入される。 $par9 = "10"; # 文字列 10 を代入。整数の10ではない。 $par9 = $par9 + 0; # 文字列 10 を整数の 10 に型変換(?)したいときは、0を足す。たしか。 $par9 = $par9 . ""; # 整数 10 を文字列の 10 に型変換(?)したいときは、空文字列 "" を結合させる?
変数の書き方にはいろいろある。
# 以下、5つの書き方は、すべて同じ意味で、$par1 に文字列 aa を代入している。 $par1 = "aa"; ${par1} = "aa"; ${"par1"} = "aa"; ${'par1'} = "aa"; ${"pa" . "r1"} = "aa"; # . は文字列結合演算子。 # さらに、以下のように書いても、$par1 に文字列 aa を代入している。 $str = "par1"; ${"$str"} = "aa"; ${$str} = "aa"; $$str = "aa"; # さらに、以下のように書いても、$par1 に文字列 aa を代入している。 ${$tmp0="par0"; $tmp1="par1";} = "aa"; ${&fun();} = "aa"; sub fun{ return "par1"; }
配列変数では、複数のデータをいっぺんに扱うことができる。配列の添え字は0から始まる。配列のi番目の要素にアクセスするには、$配列名[i]とする。
@arr = ("aa", "bb", "cc"); # 配列変数 @arr に文字列を代入。 # すなわち、配列の要素0に文字列 aa 、要素1に文字列 bb 、要素2に文字列 cc を代入。 # これは、以下の文と同値。 $arr[0] = "aa"; $arr[1] = "bb"; $arr[2] = "cc";
配列変数には、整数、実数、文字列などの異なる型のものでも1つの配列に格納できる。そもそも型はあるんだろうか。
@arr = ("aa", 1000, 1.4142); # $arr[0] に 文字列 aa 、$arr[1] に 整数 1000 、$arr[2] に 実数 1.4142 を代入。
配列変数をスカラー変数に代入すると、配列の要素数が代入される。また、$#配列名というスカラー変数は、配列の最後の要素の添え字の値、すなわち、配列の要素数から1引いた数を格納する。
#!/usr/bin/perl @arr = ("aa", "bb", "cc"); $num1 = @arr; # 配列の要素数 3 を代入。 print @arr, "\n"; # 配列の中身をすべて表示。 print $num1, "\n"; # $num1の値 3 を表示。 $num2 = $#arr; # 配列の最後の添え字の値 2 を代入。 print $#arr, "\n"; # 配列の最後の添え字の値 2 表示。 print $num2, "\n"; # $num2の値 2 を表示。 exit;
実行結果 |
---|
aabbcc 3 2 2 |
ちなみに、配列とリストの違い。
@arr = ("aa", "bb", "cc"); $val1 = @arr; # 配列の要素数 3 を $val1 に代入。 $val2 = ("aa", "bb", "cc"); # リストの最後の要素 cc を $val2 に代入。
配列の要素をすべて空にする方法は、とりあえず以下の2通り。
@arr = ("aa", "bb", "cc"); @arr = (); # 空のリストを代入し、配列リセット。 @arr = ("aa", "bb", "cc"); $#arr = -1; # 配列の最後の添え字の値を -1 にして、配列リセット。
未定義値undefを代入しても、配列の要素数は-1にならない。undefって何者?
@arr = ("aa", "bb", "cc"); @arr = (undef, undef, undef); # 未定義値 undef 代入。 print $#arr, "\n"; # 配列の最後の添え字の値を表示。2が表示される。 @arr = (); # 配列を空に。 print $#arr, "\n"; # 配列の最後の添え字の値を表示。-1が表示される。
配列の要素すべてにアクセスする方法を示す。
#!/usr/bin/perl @arr = ("v0", "v1", "v2"); for ($i = 0; $i <= $#arr; $i++) { print "$arr[$i] "; } print "\n"; for ($i = 0; $i < @arr; $i++) { print "$arr[$i] "; } print "\n"; foreach $arr_val (@arr) { print "$arr_val "; } print "\n"; exit;
実行結果 |
---|
v0 v1 v2 v0 v1 v2 v0 v1 v2 |
配列の要素の一部を抜き出したり、配列の要素を入れ替えるには、スライス[ ]を用いる。
#!/usr/bin/perl @arr1 = ("v0", "v1", "v2", "v3", "v4"); @arr2 = @arr1[0,2,4]; # @arr1の0,2,4の要素を抜き出し、@arr2に代入。 @arr3 = @arr1[1,0,2,3,4]; # @arr1の0と1の要素を入れ替えたものを、@arr3に代入。 @arr4 = @arr1[0,0,1,1,0]; # @arr1の0と1の要素を抜き出し、@arr4に代入。 @arr5 = @arr1[0..3]; # @arr1の0から3の要素を抜き出し、@arr5に代入。 @arr6 = @arr1[0..2,1]; # @arr1の0から3の要素と1の要素を抜き出し、@arr6に代入。 @arr7 = @arr1[0..2, 1..3, 2..4]; # @arr1の0から3の要素と1の要素を抜き出し、@arr7に代入。 print "1: @arr1\n"; print "2: @arr2\n"; print "3: @arr3\n"; print "4: @arr4\n"; print "5: @arr5\n"; print "6: @arr6\n"; print "7: @arr7\n"; exit;
実行結果 |
---|
1: v0 v1 v2 v3 v4 2: v0 v2 v4 3: v1 v0 v2 v3 v4 4: v0 v0 v1 v1 v0 5: v0 v1 v2 v3 6: v0 v1 v2 v1 7: v0 v1 v2 v1 v2 v3 v2 v3 v4 |
配列の要素の一部に代入するときにも、スライスが使える。
#!/usr/bin/perl @arr1 = ("v0", "v1", "v2", "v3", "v4"); @arr2 = ("v0", "v1", "v2", "v3", "v4"); @arr2[1..3] = @arr1[0,2,4]; # @arr1の0,2,4の要素が、@arr2の1から3に代入。 @arr3[2..4,6] = @arr1; # @arr1の0から3の要素が、@arr3の2,3,4,6に代入。 print "1: @arr1\n"; print "2: @arr2\n"; print "3: @arr3\n"; exit;
実行結果 |
---|
1: v0 v1 v2 v3 v4 2: v0 v0 v2 v4 v4 3: v0 v1 v2 v3 |
スライスはリストにも使える。
#!/usr/bin/perl @arr1 = ("v0", "v1", "v2", "v3", "v4")[0,2,4]; print "@arr1\n"; exit;
実行結果 |
---|
v0 v2 v4 |
[ ]の中は、変数でもリストでも、サブルーチンでも良い。
#!/usr/bin/perl $n_0 = 0; $n_1 = 1; @arr1 = ("v0", "v1", "v2", "v3", "v4"); @arr2 = (1,2,3); @arr3 = @arr1[$n_0 .. $#arr1]; # @arr1の要素すべてを@arr2に代入。 @arr3 = @arr1[@arr2]; # @arr1の1,2,3の要素を抜き出し、@arr3に代入。 @arr4 = @arr1[@arr2, @arr2]; # @arr1の1,2,3,1,2,3の要素を抜き出し、@arr4に代入。 @arr5 = @arr1[(1,1,2,2,3)[0,4]]; # @arr1の1,3の要素を抜き出し、@arr5に代入。 @arr6 = @arr1[@arr2[0,1]]; # @arr1の1,2の要素を抜き出し、@arr6に代入。 @arr7 = @arr1[@arr2[$n_0,$n_1]]; # 上と同じ。 @arr8 = @arr1[&fun1()]; # @arr1の0,2,4の要素を抜き出し、@arr8に代入。 sub fun1 { return 0,2,4; } @arr9 = @arr1[&fun2()]; # @arr1の1から3の要素を抜き出し、@arr9に代入。 sub fun2 { return 1..3; } print "1: @arr1\n"; print "2: @arr2\n"; print "3: @arr3\n"; print "4: @arr4\n"; print "5: @arr5\n"; print "6: @arr6\n"; print "7: @arr7\n"; print "8: @arr8\n"; print "9: @arr9\n"; exit;
実行結果 |
---|
1: v0 v1 v2 v3 v4 2: 1 2 3 3: v1 v2 v3 4: v1 v2 v3 v1 v2 v3 5: v1 v3 6: v1 v2 7: v1 v2 8: v0 v2 v4 9: v1 v2 v3 |
ファイルの任意の行を読み込みたいときに、スライスが使える。
# ファイル名: datを読み込み、1,3,5行目を@arrに代入するには、以下のようにする。 open(IN,"dat"); @arr = (<IN>)[0,2,4]; close(IN);
二次元配列も扱える。
#!/usr/bin/perl # 二次元配列に値代入。2*2の正方行列っぽく。 @arr1 = ( [ "v00", "v01" ], [ "v10", "v11" ] ); # 上記は、以下のように書いても同じ。 # $arr1[0][0] = "v00"; # $arr1[1][0] = "v10"; # $arr1[0][1] = "v01"; # $arr1[1][1] = "v11"; # 二次元配列に値代入。要素数が行によってばらばらでもOK。 @arr2 = ( [ "vv00", "vv01" ], [ "vv10", "vv11", "vv12", "vv13" ], [ "vv20", "vv21", "vv22" ] ); # m行n列の要素を参照するには、$配列名[m][n]とする。ただし、m, n∈{0, 1, 2, ...} print "$arr1[0][0]\n"; # \nは改行を表す。 print "$arr1[1][0]\n"; print "$arr1[0][1]\n"; print "$arr1[2][2]\n"; # 未定義値(?)を参照。 print "$arr1[1][1]\n"; print "$arr2[0][0]\n"; print "$arr2[1][1]\n"; print "$arr2[1][3]\n"; print "$arr2[1][4]\n"; # 未定義値(?)を参照。 print "$arr2[2][2]\n"; exit;
実行結果 |
---|
v00 v10 v01 v11 vv00 vv11 vv13 vv22 |
二次元配列の要素数を求める。配列変数をスカラー変数に代入すると、配列の要素数が代入される。また、$#配列名という値は、配列の最後の要素の添え字の値、すなわち、配列数から1引いた数になる。
@arr = ( [ "vv00", "vv01" ], [ "vv10", "vv11", "vv12", "vv13" ], [ "vv20", "vv21", "vv22" ] ); $row = @arr; # $rowに@arrの行数である 3 が代入される。 $col0 = @{$arr[0]}; # $col0 に@arrの0行目の要素数である 2 が代入される。 $col1 = @{$arr[1]}; # $col1 に@arrの1行目の要素数である 4 が代入される。 $col2 = @{$arr[2]}; # $col2 に@arrの2行目の要素数である 3 が代入される。 $row = $#arr; # $rowに@arrの行数から1を引いた 2 が代入される。 $col0 = $#{$arr[0]}; # $col0 に@arrの0行目の要素数から1を引いた 1 が代入される。 $col1 = $#{$arr[1]}; # $col1 に@arrの1行目の要素数から1を引いた 3 が代入される。 $col2 = $#{$arr[2]}; # $col2 に@arrの2行目の要素数から1を引いた 2 が代入される。
二次元配列の要素すべてにアクセスする方法を三つ示す。
#!/usr/bin/perl @arr = ( [ "v00", "v01" ], [ "v10", "v11", "v12", "v13" ], [ "v20", "v21", "v22" ] ); print "method 1\n"; for ($i = 0; $i <= $#arr; $i++) { for ($j = 0; $j <= $#{$arr[$i]}; $j++) { print "$arr[$i][$j] "; } print "\n"; } print "method 2\n"; for ($i = 0; $i < @arr; $i++) { for ($j = 0; $j < @{$arr[$i]}; $j++) { print "$arr[$i][$j] "; } print "\n"; } print "method 3\n"; foreach $arr_ref (@arr) { foreach $arr_val (@{$arr_ref}) { print "$arr_val "; } print "\n"; } exit;
実行結果 |
---|
method 1 v00 v01 v10 v11 v12 v13 v20 v21 v22 method 3 v00 v01 v10 v11 v12 v13 v20 v21 v22 method 2 v00 v01 v10 v11 v12 v13 v20 v21 v22 |