Perl の scalar/list/hash ======================== {{toc 3-}} ### 概要 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};