2024/02/13 22:13:39

Perl の scalar/list/hash

概要

Perlの変数には以下の3つがあります。

  • スカラー
  • リスト
  • ハッシュ

それぞれ $ / @ / % という記号(Sigil)を変数名につけます。

  • $scalar
  • @list
  • %hash

$scalar

# my 関数で局所化
my $foo; # is undef (未定義)

# 数値の代入
$foo = 1;

# 空の代入
$foo = ''; # is not undef (空が定義された)

# 文字列の代入(ダブルクオート)
$foo = "bar\n";
print $foo; # bar (\n は改行コードとして解釈される)

# 文字列の代入(シングルクオート)
$foo = 'bar\n';
print $foo; # bar\n (\n はそのまま表示される)

# $hoge に $foo (=bar) を代入
my $hoge = $foo;

# 文字列の代入(ダブルクオート) ふたたび
$foo = "bar$hoge";
print $foo; # barbar ($hoge は展開して表示される)

# 文字列の代入(シングルクオート) ふたたび
$foo = 'bar$hoge';
print $foo; # bar$hoge ($hoge は展開されずそのまま表示される)

@foo_list

# my 関数で局所化
my @foo_list; # 全要素が未定義

# 代入
@foo_list = (0, '', 1, 'foo', "bar\n", $foo, "$foo$hoge", undef);

# 未定義にする
@foo_list = ();

# qw(is Word list Operators)
@foo_list = qw/0 1 2 foo bar baz/; # タブやスペースや改行をデリミタとしてリストを生成できる(変数は展開されない)

# n番目の要素を参照する
my @bar_list = qw/1 2 bar/;
print $bar_list[0]; # 1
print $bar_list[1]; # 2
print $bar_list[2]; # bar

# 最後の要素を参照する
my @foo_list = qw/1 2 bar/;
print $foo_list[-1]; # bar

# リストはスカラーコンテキストで評価されると要素数を返す
my @foo_list = qw/1 2 bar/;
print scalar @foo_list; # 3

# sigil を $# とすると、最後の添え字(要素数 - 1)を得ることができる
my @foo_list = qw/1 2 bar/;
print $#foo_list; # 2

リストを操作する関数

my @foo_list = ('giants', 'carp', 'tigers');

# shift 配列の最初の要素を取り出す
my $top = shift @foo_list; # ('carp', 'tigers'): $top > 'giants'

# pop 配列の最後の要素を取り出す
my $last = pop @foo_list; # ('carp'): $last > 'tigers'

# unshift 配列の先頭に要素を追加する。
unshift @foo_list, 'giants'; # ('giants', 'carp')

# push 配列の最後に要素を追加する
push @foo_list, 'tigers'; # ('giants', 'carp', 'tigers')

# sort リストを並べ替える(デフォルトは文字コード順)
my @sorted_foo_list = sort @foo_list; # ('carp', 'giants', 'tigers')

# sort 数値順に並べ替える(降順にするなら { $b <=> $a } )
my @sort_num = sort { $a <=> $b } qw/5 56 23 2 8/; # (2, 5, 8, 23, 56)

# sort 文字コード順に並べ替える(明示的に)
my @sort_char = sort { $a cmp $b } @sort_num; # (2, 23, 5, 56, 8)

# reverse リストを逆順にする
# map 要素を評価し、結果を返す
# grep 要素を評価し、真になった要素を返す
# splice 要素を任意の位置で削除/追加する(いろいろ複雑なことができる)

%hash

# my 関数で局所化
my %hoge; # 未定義

# 代入 ( key => 'value', )
%hoge = (
    red   => 'FF0000',
    green => '009900',
    blue  => '0000AA',
);

# 参照
print $hoge{red}; # FF0000

ハッシュを操作する関数

# keys キーをリストで取り出す
my @key_list = keys %hoge; # 順序は保障されない

# values 値をリストで取り出す
my @value_list = values %hoge; # 順序は保障されない

# each キーと値の組み合わせを取り出す
my ($key, $value) = each %hoge;

# exists キーが存在すれば真
if (exists $hoge{red}) {
    print "we have red."
}

# delete 指定したキーとその値を削除する
delete $hoge{red};
サイト内検索