スカラー変数・配列・連想配列


スカラー変数
perlでは、変数の格納には、先頭に「$」のついた名前を使います。これがスカラー変数と呼ばれるものです。
$num = 25;
$greeting = "hello";
上記のように、スカラー変数は、数値を代入すれば数値を、文字列を代入すれば文字列を保持します。なお、perlでは、このように代入される値をリテラルと言います。
--
プログラム例:
#!/usr/local/bin/perl

$num = 25; #$numは数値
$greeting = "hello"; #$greetingは文字列

print "$num $greeting world\n";
print $num+$greeting,"\n"; #数値+文字列の演算でもエラーが出ない。文字列=0 扱い。

exit (0);

出力:25 hello world
   25
--


配列
perlでは、配列は先頭に「@」をつけた変数で表します。スカラー変数と同様に、数値か文字列が代入できます。
@num=(1, 2, 3, 4, 5);
@name = ("Tom", "Henry", "Ron", "Cathy", "Beth", "William", "Nancy");
@empty=();
#これは空の配列
配列の1つの要素を参照する時は添字を使います。
print $num[0]; → 1
print $num[4]; → 5
配列の先頭は0から数えることに注意して下さい。また、配列の1つの要素はスカラー変数になる($をつける)ことにも注意して下さい。
配列の最後の添字の数値を調べるには、以下のようにします。
print $#num; → 4
結果として、これに1を加えれば、配列の要素数が得られます。
配列を出力する時は、以下の2通りがあります。
print @num; → 12345
print "@num"; → 1 2 3 4 5
「""」で囲むと、区切り文字付きで出力されます。
配列の各要素の値は、別の数値を代入して変更することもできます。
$num[1] = 8;
print "@num";
→ 1 8 3 4 5


配列の操作

grep関数
構文:grep(式, 配列)
働き:ある配列の中から、条件に合う要素だけを抜き出し、新たな配列を作ります。
例:
#!/usr/local/bin/perl

@name = ("Tom", "Henry", "Ron", "Cathy", "Beth", "William", "Nancy");
@item=grep(/a/,@name); #/a/で、小文字のaを含む要素を指定しています
print "@item";
exit (0);

出力:Cathy William Nancy

split関数/join関数
構文:split(デリミタ, 文字列) join(デリミタ、配列)
働き:split関数は、デリミタによって文字列を分割し、配列に収めます。
   join関数は、デリミタによって配列の要素を結合し、文字列を返します。
例:
#!/usr/local/bin/perl

$mojiretsu = "A Perl program may now access DBM, NDBM, SDBM, GDBM, and Berkeley DB files from the same script simultaneously.";
@array = split(/ /, $mojiretsu); #/ /には半角スペースが書いてあります。
#以下は配列を処理するための独特のループ - foreach文
foreach $yoso (@array) {
  print "$yoso\n";
}

exit (0);

* 配列@arrayは、$XXX = join(/ /, @array); で元の文字列にかえります。

push関数/pop関数
構文:push(配列, データ)  pop 配列
働き:push関数は、配列の末尾にデータを追加します。配列の要素数は1増します。
   pop関数は、配列の末尾のデータを取り出します。配列の要素数は1減します。
例:push (@array, "add"); $a = pop @array; print $a; → add

shift関数/unshift関数
構文:shift(配列, データ)  unshift 配列
働き:shift関数は、配列の最初のデータを取り出します。配列の要素数は1減します。
   unshift関数は、配列の最初にデータを追加します。配列の要素数は1増します。
例:unshift (@array, "add"); $a = shift @array; print $a; → add

splice関数
構文:splice(配列, オフセット位置, 要素数, データリスト)
   要素数、データリストは省略可能
働き:「配列」中の「オフセット位置(0から数えはじめる)」から「要素数」分だけ要素を取り除きます。「要素数」を省略すると、「オフセット位置」から最後までが削除されます。「データリスト」を書くと、取り除かれた要素の代わりに新しい要素を加えます。

sort関数/reverse関数
構文:sort 配列、sort(サブルーチン, 配列)  reverse 配列
働き:sort関数は配列をソートし、新たな配列を返します。通常ASCII文字列順にソートするため、数値でソートするにはサブルーチンを呼び出す必要があります。
   reverse関数は、配列を逆に並べ替えます。
例:@array = sort @array;

foreach文
構文:foreach スカラー変数 (配列) {ブロック}
働き:foreach文は、配列の各要素を順番にスカラー変数に格納し、要素数分だけ反復処理を行います。この際にブロック内でスカラー変数(要素)を変更すると、元の配列の要素も変更されます。

for文
構文:for (式1; 式2; 式3) {ブロック}
働き:式1で定義された初期値から、式2で定義された終了条件までブロックを反復処理します。式3は増減値を定義します。
例:
for($i=0; $i<20; $i++) {
  print $i, "\n";
}
$i++は、反復ごとに$iの値を1ずつ増加させます。$i=$i+1/$i+=1と同じです。
先の例をfor文を使って書くと、以下のようになります。
#!/usr/local/bin/perl

$mojiretsu = "A Perl program may now access DBM, NDBM, SDBM, GDBM, and Berkeley DB files from the same script simultaneously.";
@array = split(/ /, $mojiretsu); #/ /には半角スペースが書いてあります。
#以下は配列を処理するためののループ - foreach文をfor文に置き換え
for($i=0; $i<=$#array; $i++) {
  print "$array[$i]\n";
 }

exit (0);

next文/last文
構文:next  last
働き:next文は、それ以降のブロックを実行せず、次のループに移します。
   last文は、ループを抜けます。


連想配列
連想配列は、keyとvalueという2つの組からなる配列です。連想配列は先頭に「%」をつけた変数で表します。
例:
%week = ("Sunday", "日曜日", "Monday", "月曜日", "Tuesday", "火曜日", "Wednesday", "水曜日", "Thursday", "木曜日", "Friday", "金曜日", "Saturday", "土曜日");
print $week{"Sunday"};
→ 日曜日

連想配列の各要素のvalueを取り出すには、$配列名{key}という書き方をします。
連想配列では、その順序は不定です。print %week; としても、元の配列の順序が返されるとは限りません。

each関数
構文:each(連想配列)
働き:連想配列のkeyとvalueの2つの要素からなる配列を返します。
--
#!/usr/local/bin/perl

%week = ("Sunday", "日曜日", "Monday", "月曜日", "Tuesday", "火曜日", "Wednesday", "水曜日", "Thursday", "木曜日", "Friday", "金曜日", "Saturday", "土曜日");

#while文は( )内の式が真の間(この場合は%weekの要素がある間){ }のブロックを繰り返す
while (@pair = each %week) {
  $day = $pair[0]."\t".$pair[1]; #文字列同士は「.」で連結できる。「\t」はタブ。
  push(@array, $day); #keyとvalueをタブでつないだ要素を配列@arrayに格納
}

foreach $yoso (@array) {
  print "$yoso\n";
}

exit (0);

出力:
Monday 月曜日
Thursday 木曜日
Wednesday 水曜日
Sunday 日曜日
Saturday 土曜日
Friday 金曜日
Tuesday 火曜日
--

delete関数
構文:delete 連想配列名{key}
働き:連想配列から要素を削除します。
例:
delete $week{'Monday'};

while文
構文:while (式) {ブロック}
働き:(式)が真の間、ブロックを繰り返します。(式)が偽にならないと、無限ループになります。