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";