Perl 基本チートシート
自分用の覚え書き。
条件分岐
#!/usr/local/bin/perl =pod 条件分岐の基本。 =cut use strict; use warnings; my $number; &test($number); $number = 100; &test($number); $number = 99999; &test($number); sub test { my ($num) = @_; # defined は定義されているかの確認。 # else if は言語によって書き方が異なるので覚えにくい。 if (!defined $num) { print "Not defined num.", "\n"; } elsif ($num == 100) { print "num=$num", "\n"; } else { print "num=$num", "\n"; } }
配列
#!/usr/local/bin/perl =pod 配列の基本。 =cut use strict; use warnings; # 定義 my @array = (); my $ref_array = []; # 追加 # リファレンスでは push の使用不可。 $array[0] = "test1"; $array[1] = "test2"; push (@array, "test3"); $ref_array->[0] = "rtest1"; $ref_array->[1] = "rtest2"; # 参照 # まずこの改行の書き方をよく忘れる。 print $array[0], "\n"; print $ref_array->[0], "\n"; # 結合 print join('/', @array), "\n"; print join('&', @{$ref_array}), "\n"; # 要素数 my $length = @array; my $length2 = scalar(@array); my $ref_length = @{$ref_array}; my $ref_length2 = scalar(@{$ref_array}); print "length=$length", "\n"; print "length2=$length2", "\n"; print "ref_length=$ref_length", "\n"; print "ref_length2=$ref_length2", "\n"; # ループ foreach my $value(@array) { print "foreach array: value=$value", "\n"; } foreach my $value(@{$ref_array}) { print "foreach ref_array: value=$value", "\n"; } # $#array 最後要素のインデックス # 配列の(要素数-1)はこれでもいけるが、# がちょっと気持ち悪い。 # $i <= (要素数-1) の書き方もあまり好きではない。 for (my $i = 0; $i <= $#array; $i++) { print "for array: value[$i]=", $array[$i], "\n"; } for (my $i = 0; $i <= $#{$ref_array}; $i++) { print "for ref_array: value[$i]=", $ref_array->[$i], "\n"; } # scalar の方が好み。 for (my $i = 0; $i < scalar(@array); $i++) { print "for array scalar: value[$i]=", $array[$i], "\n"; } for (my $i = 0; $i < scalar(@{$ref_array}); $i++) { print "for ref_array scalar: value[$i]=", $ref_array->[$i], "\n"; } # スライス my @array_select = @array[0, 2]; foreach my $value(@array_select) { print "array_select: value=$value", "\n"; }
連想配列
#!/usr/local/bin/perl =pod 連想配列の基本。 =cut use strict; use warnings; # 定義 # key => value を括弧内に記載することで初期値格納も可能。 my %hash = (); my $ref_hash = {}; # 追加 $hash{num1} = 1; $hash{num2} = 2; $hash{flg} = 0; $hash{test_key} = "100key"; $ref_hash->{rnum1} = 200; $ref_hash->{rnum2} = 11; $ref_hash->{rtest_key} = "200key"; # キー存在確認 if (exists $hash{test_key}) { print "hash{test_key}=$hash{test_key}", "\n"; } if (exists $ref_hash->{rtest_key}) { print "ref_hash->{rtest_key}=$ref_hash->{rtest_key}", "\n"; } # 全てのキーを取り出す my @input_keys = keys %hash; my @input_rkeys = keys %{$ref_hash}; # 全ての値を取り出す my @input_values = values %hash; my @input_rvalues = values %{$ref_hash}; # ループ while (my ($key, $value) = each(%hash)){ print "while each hash: ", "key=", $key, " value=", $value, "\n"; } while (my ($key, $value) = each(%{$ref_hash})){ print "while each ref_hash: ", "key=", $key, " value=", $value, "\n"; } # value の昇順でソートしてループ # 降順の場合は、 a と b が逆になる。 # 数値の場合は、 cmp の代わりに <=> を使用する。 foreach my $key (sort {$hash{$a} cmp $hash{$b}} keys %hash){ print "sort hash: ", "key=", $key, " value=", $hash{$key}, "\n"; } foreach my $key (sort {${$ref_hash}{$a} cmp ${$ref_hash}{$b}} keys %{$ref_hash} ){ print "sort ref_hash: ", "key=", $key, " value=", $ref_hash->{$key}, "\n"; } # スライス my @hash_select = @hash{'num1', 'flg'}; foreach my $value(@hash_select) { print "hash_select: value=$value", "\n"; }
応用
#!/usr/local/bin/perl =pod 連想配列と配列の応用。 key ごとにソートした value のリストを取得して一気に結合。 =cut use strict; use warnings; my %fruits = ( key3 => "苺", key1 => "林檎", key5 => "バナナ", key4 => "サクランボ", key2 => "杏子", ); my @fruitslist = map { $fruits{$_} } (sort keys %fruits); print join('...', @fruitslist), "\n";