Perlに関するメモ
関数渡し、ブロック渡し
#基本な
sub myAdd {
my ($a, $b) = @_;
return $a + $b;
}
#関数受け取る
sub exceFunc {
my $f = shift;
return &$f; # return $f->(@_); でもよい
}
#呼び出しな
my $v = exceFunc \&myAdd, 10, 30;
#プロトタイプで書き直すと
#関数受け取る
sub exceFunc(&$$) {
my $f = shift;
local ($a, $b) = @_; # ブロック内で使う変数をここで動的スコープ(?)にしとく
return &$f; # return $f->(@_); でもよい
}
#呼び出しな
my $v = exceFunc \&myAdd, 10, 30;
#プロトタイプなのでブロックも使える(ブロック直後はカンマなしな)
my $v = exceFunc {$a + $b} 10, 30;
多次元配列
# 以下の3つは同等
my @a = ();
for $i (0..10) {
my @b = func($i);
$a[$i] = [@b];
}
my @a = ();
for $i (0..10) {
my @b = func($i);
$a[$i] = \@b;
}
my @a = ();
for $i (0..10) {
my @b = func($i);
@{$a[$i]} = @b;
}
# 多次元配列へのアクセス
print $a[2][3];
注意点
真偽値のtrueやfalseに相当する定数やキーワードが無い!?
文字列結合の演算子
文字列の結合演算子にはドットを使う
変数
変数名はプリフィックスをつけて使う
変数のプリフィックスにはいくつか種類があるので注意
$a = 10; # 直接書いて使うとグローバル変数ぽい
my $b = 10; # myを入れると静的スコープのローカル変数ぽくなるらしい
@c = (1, 2, 3); # @がつくと配列全体
$d = $c[0]; # 配列の中身を参照するときは@でなく$を使うらしい
($x, $y, $z) = (5, 99, 4); # リストの形で使って一度に複数の変数に代入できたりする
$e = 10;
$f = \$e; # $eの変数への参照が代入されるらしい(?)
$$f = 20; # $eの値が20に書き換わる(?)
文字列比較(重要!)
Perlでの==や>=や<=などでの比較は数値のみにしか使えない
代わりにeqやgeやleなどを使う
if ($a eq 'x') { # ==相当。 $aは'x'と一致するか。 eq は Equal の略
}
if ($b ge 'h') { # >=相当。 $bは辞書順で'h'以降にくるか。 ge は Grater than or Equal の略
}
if ($c lt 'k') { # <相当。 $cは辞書順で'k'より前にくるか。 lt は Less than の略
}
if文
if ($a == 0) {
} elsif { # elseif じゃなく elsif であることに注意!
} else {
}
for文(※注意点あり)
for ($i = 0; $i < 10; $i++) { # よくあるfor文の書き方も出来るけど
print $i."\n";
}
@a = (1, 2, 3, 4, 5);
for $var (@a) { # リストを引数で取り出すということも出来るようだ
print $var."\n";
}
@a = (1, 2, 3, 4, 5);
for my $var (@a) { # myを入れるとローカル変数?
print $var."\n";
}
@a = (1, 2, 3, 4, 5);
for (@a) { # 変数名じゃなく $_ というのでも値を使えるらしい
print $_."\n";
}
@a = (1, 2, 3, 4, 5);
foreach $var (@a) { # foreach文もあるけど、for文とどういう使い分けか調べてないからまだ分からない
print $var."\n";
}
標準入力
$line = <STDIN>; # 1行分入力される(末尾の改行文字等も含まれる)
chomp($line = <STDIN>); # 末尾文字を取り除くchompで囲むとうまく改行文字がカットできる
# chompの戻り値はカットされた文字
# chompは$lineを直接弄る模様
while (<STDIN>) { # ループ文でも使えるらしい
print $_;
}
標準出力
printとsayがあるが
sayを使うにはファイルの冒頭に use v5.10;(またはそれ以降のバージョン) を入れる必要がある。
printとsayの違いは改行文字が入るか入らないからしい(?)
print 'abc'."\n";
@a = (1, 2, 3);
print @a; # 要素が区切り文字なしに一列に並び、 123 と出力される
#----
use v5.10;
say 'abc'; # 改行も出力される
@a = (1, 2, 3);
say @a; # 要素ごとに改行されて出力される。
配列・リスト・両端キュー
配列のサイズを知るには scalar(@a) を使う
@a = (); # 空の配列が作れる
@a = (1, 2, 3); # 要素の初期値を指定しての配列の生成
@a = (0) x 100; # 100個の配列ができ、全てに0が代入される ※この方法だとうまくいかないことがあった
@a = 0 x 100; # これは$a[0]に0が百個の配列を作るようで、その配列へのアクセス方法が不明で使えない
#なので
@a =();
foreach (@a[0..99]) { $_ = 0; } # のほうがよさげ
@a = (Object->new()) x 100; # 注意点として、 100個の配列ができ、全てに同一インスタンスが代入される
# 個別のインスタンスを入れたいなら
@a = ();
foreach (@a[0 .. 99]) { $_ = Object->new(); } # とする
# 配列の要素へのアクセスは まぁ難しくはない
print $a[10];
# 複数の値を同時に操作とか出来るようだ
($b, $c) = @a[2 .. 3]; # 配列の2番目3番目からの各変数へ
@a[2 .. 4] = (5, 9, 3); # 配列の2番目3番目4番目へそれぞれ代入
# 両端キューとしても使える
push @a, 5; # 末尾に5を加える。 push(@a, 5); とも書ける
$b = pop @a; # 末尾から取り出す。$b = pop(@a); とも書ける
unshift @a, 5; # 先頭に5を加える。 unshift(@a, 5); とも書ける
$c = shift @a; # 先頭から取り出す。$c = shift(@a); とも書ける
push @a, (1, 2, 3); # @aに1をpushして、次に2をpushして、最後に3をpushする
push @a, @b; # 同様に@bの要素が順番に@aにpushされていく
サブルーチン・関数
関数の呼び出しには&のプリフィックスが必要だが
関数名がユニークな場合は省略できるらしい
関数名定義で名前のとこに()を書いたらダメ、名前のみを書こう
sub myfunc1 { # このように定義する
my $x = shift @_; # 引数はリストとして @_ で参照できるらしい
return $x * 2;
}
sub myfunc2 {
my $x = $_[0]; # @_ はリストだから $_[0] というアクセスでも取り出せる?
return $x * 2;
}
sub myfunc3 {
my ($a, $b, $c) = @_; # まとめて取得
return $a * $b * $c;
}
sub myfunc4 {
my ($a, $b) = @_;
$a * $b; # return文を省略すると最後の式の値が戻り値になるらしい
}
&myfunc1(30); # 呼び出しは & のプリフィックスをつけて
myfunc2(30); # 名前がユニークなら & の省略も可能(?)
最終更新:2016年01月19日 10:26