2019年5月7日火曜日

[Perl] 01. 型

Perl をファイル処理を行う際の便利ツールとして使用していたのですが、最近は他のスクリプト言語を使う機会が増えてきました。脳内メモリ容量が少ないので、忘れそうな内容をメモしておこうと思います。
今回はPerlで使う型について。

Perlの変数の型は、スカラー、配列、ハッシュ(連想配列)の3種類に大きき分けられ、変数の頭にそれぞれ $, @, % を付加することで判別する。
整数/浮動小数点/文字列 などを自動で判別してくれる。



スカラー
スカラー ($) には1つの値を格納できる。bash と似ているが、Perlは値を代入する際も '$' が必要なので注意。
$x = 2;
$y = 10.5;
$z = "abc";

print "$x, $y, $z\n";  # 出力結果: 2, 10.5, abc

配列
配列 (@) は複数の値を格納できる。個別に要素を操作する場合は '@' ではなく '$' を使用する必要がある点に注意。
また、配列に要素を代入する際は左側が0番地になる。
# 要素を代入
@array = ('a', 'b', 'c', 'd');
print "@array  ([0] = $array[0])\n";

# 先頭の要素に追加
unshift @array, 'S';
print "@array\n";

# 先頭の要素を削除
shift @array;
print "@array\n";

# 末尾の要素に追加
push @array, 'E';
print "@array\n";

# 末尾の要素を削除
pop @array;
print "@array\n";

# 要素を上書き ('$' を使用)
$array[1] = 'M';
print "@array\n";

# 要素を抽出 ('$' を使用)
$x = $array[1];
print "$x\n";
実行結果
a b c d  ([0] = a)
S a b c d
a b c d
a b c d E
a b c d
a M c d
M

splice 関数を使えば複雑な処理もできるようになる。
@array = ('a', 'b', 'c', 'd');
print "@array\n";

# 要素を複数上書き (@array の[2]から3つ上書き)
splice @array, 2, 3, 'X', 'Y', 'Z';
print "@array\n";

# 途中に要素を追加 (@array の[2]に挿入)
splice @array, 2, 0, 'M';
print "@array\n";

# 途中の要素を削除 (@array の[2]から1つ削除)
splice @array, 2, 1;
print "@array\n";
実行結果
a b c d
a b X Y Z
a b M X Y Z
a b X Y Z

文字列の配列を指定する場合はクォート演算子(qw)を使うと入力が楽になる。文字列内にスペースがある場合は使えないのが欠点。
@array = ('aaa', 'bbb', 'ccc');
@array = qw(aaa bbb ccc);

ハッシュ(連想配列)
(キー => 値) で指定する。キーは文字列扱いになる。こちらも個別に要素を操作する場合は '%' ではなく '$' を使用する必要がある点に注意。

# 要素を代入
%hash = (key1 => 'abc', key2 => 'def', key3 => 'ghi');
print "$hash{key1} $hash{key2} $hash{key3}\n";

# 要素数を取得
$num = keys %hash;
print "$num\n";

# 要素を追加
$hash{key4} = 'xyz';
$num = keys %hash;
print "$num $hash{key4}\n";

# 要素を削除
delete $hash{key2};
$num = keys %hash;
print "$num\n";

## キーの存在確認 (存在していれば 1 が返る)
$result = exists $hash{key2};
print "$result\n";
$result = exists $hash{key1};
print "$result\n";
実行結果
abc def ghi
3
4 xyz
3

1

おまけ
use strict;
use warnings;

を記述しておくと構文チェックをしてくれます。一般的にこれらはほぼ必須とされているようです。
strict を使用する場合は、変数の局所化をしないと "パッケージ名を明示していないグローバル変数がある" と怒られるので注意。変数宣言時に変数の前に my を付ければ解決するよ。


0 件のコメント:

コメントを投稿