プログラミング > Perl

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に相当する定数やキーワードが無い!?


文字列結合の演算子

文字列の結合演算子にはドットを使う
$s = 'abc' . $k . "\n";
 
 

変数

変数名はプリフィックスをつけて使う
変数のプリフィックスにはいくつか種類があるので注意
$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文(※注意点あり)

http://perldoc.perl.org/perlsyn.html
C言語系と違い
breakじゃなくlast
continueじゃなくnext
を使う
他にredoというのもある
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