#変数宣言
スカラ$
$hoge = "A";
配列@
@array = (1,2,3);
ハッシュ%
%hash = ("red"=>"apple","purple"=>"grape");
#修飾子
my
レキシカルスコープ変数:サブルーチン内で定義された場合、サブルーチンを抜けた時点で破棄される変数となる。private。ローカル変数
#構文
if
if($i == 0){}
elsif($i ==1){}
else{}
for
for(my $c = 0; $c < 100; $c++){
}
while
my $i=0;
while($i < 10){
print "s";
$i++;
}
foreach
foreach my $k (@arr){
}
#サブルーチン
sub sroutine{
return retval;
}
呼ぶ時は
$val = &sroutine;
sub sroutine{
return $retval;
}
引数があるときの呼び方
$val = &sroutine(1,2,4);
sub sroutine{
($a,$b,$c) = @_
return $a + $b + $c;
}
このように引数は@_で受け取っている。
#配列の操作
配列の添字
負の値をつけると末尾から走査する。(末尾は-1から始まる)
配列の要素数や添字の取得
@hoge = (100,1002,122);
$num = $#hoge; #最後の添字を取得 この場合は2
$num = @hoge; #配列の要素数を取得 この場合は3
配列のソート
#数値の配列のソート
@sorted = sort{$a <=> $b} @nums;
#$a $bと書いてアレばそれは昇順(小さいほうが先頭)のソートである。
#文字列の辞書順のソート
@sorted = sort($a cmp $b) @strs;
#sortして一度では並び順を確定できなかった時
sort{length $a <=> length $b || $a cmp $b} @strs;
#これは要素の文字列の長さでソートして、それで確定できなかったら辞書順ソート
C#/LinqのSelect的なもの:Map
my @a = (1 .. 10);
my @b = map{$_ * 2} @a;
C#/LinqのWhere的なもの:grep
my @c = grep{$_ %2 == 0} @b;
#ハッシュの操作
キーのリストを取得
my %fruit = ("red" => "apple","yellow" => "banana");
my @ks = keys %fruit;
値のリストを取得
my %fruit = ("red" => "apple","yellow" => "banana");
my @vs = values %fruit;
注意:
このようにして作られたキーや値の配列の順序が入れた挿入した順序とは異なる。ただし、keys-valuesの対応付けはしっかりしてる。(ハッシュで順序変更してるのかな?)
@sorted keys = sort{$a cmp $b} (keys %fruit);
片方だけソートすると当然対応付けが壊れるので注意。順序が必要な物は普通に配列でやったほうが良い。
また
while((my $kt, my $vt) = each(%days)){
print "$kt : $vt";
}
のように、列挙することもできる。
#リファレンス
参照(実体を指し示すもの)
リファレンスを使うとハッシュの中にハッシュを格納し、ハッシュにハッシュを格納するみたいな複雑な構造が定義できる。
my $akami = ['maguro', 'katsuo'];
my $shiromi = ['tai', 'hirame'];
my @sushi = ($akami, $shiromi);
print $sushi[1][1]; # => hirame
例えばこれは配列のリファレンスを配列化したもの
リファレンスの簡単な書き方
-配列
my $array_ref = ["This","is","array-ref"];
-ハッシュ
my $array_ref = {"t" => "This",,"i" => "is","a" => "array-ref"];
配列は()の代わりに[]
ハッシュは()の代わりに{}を使う。