Sponsored Link

ハッシュの宣言と参照

ハッシュ(連想配列)は数値で表されるインデックスではなく、数値・文字列などのキーから値を参照する特殊な配列です。 ハッシュを宣言する場合は「%ハッシュ名」とします。 要素を追加する場合は、ソースコードのように「キー => 値」とします。

#!c:\perl\bin\perl.exe

# ハッシュ

%santakutai = (
  "uni" => "soba",
  "tempura" => "udon",
  "tekkadon" => "rahmen"
);

print $santakutai{"uni"}, "\n";
print $santakutai{"tempura"}, "\n";
print $santakutai{"tekkadon"}, "\n";
 "soba",
  "tempura" => "udon",
  "tekkadon" => "rahmen"
);

print $santakutai{"uni"}, "\n";
print $santakutai{"tempura"}, "\n";
print $santakutai{"tekkadon"}, "\n";]]>
実行結果
soba
udon
rahmen

次の例のように、キーに数値を指定しても構いません。

#!c:\perl\bin\perl.exe

# キーに数値を指定した例

%numbers = (
  298 => "nikyuppa",
  503 => "gomarusan",
  110 => "hyakutohban"
);
 "nikyuppa",
  503 => "gomarusan",
  110 => "hyakutohban"
);]]>
実行結果
nikyuppa
gomarusan
hyakutohban

空のハッシュを作成しておき、後から要素を追加するということもできます。

#!c:\perl\bin\perl.exe

# 空のハッシュを作成
%numbers = ();

# 要素を追加
$numbers{119} = "shoubou";
$numbers{911} = "rescue";

print $numbers{119}, "\n";
print $numbers{911}, "\n";
実行結果
shoubou
rescue

ハッシュとwhile, each

ハッシュに対して列挙を行うには、whileとeachを使用します。 この場合、eachによってキーと値のペアを配列を受け取ります。

#!c:\perl\bin\perl.exe

# ハッシュとwhile, each

%santakutai = (
  "uni" => "soba",
  "tempura" => "udon",
  "tekkadon" => "rahmen"
);

while ( ( $name, $food ) = each ( %santakutai ) ) {
  print $name, " said ", "'", $food, "'\n";
}
 "soba",
  "tempura" => "udon",
  "tekkadon" => "rahmen"
);

while ( ( $name, $food ) = each ( %santakutai ) ) {
  print $name, " said ", "'", $food, "'\n";
}]]>
実行結果
tekkadon said 'rahmen'
uni said 'soba'
tempura said 'udon'

keys, values

keysやvaluesを用いると、ハッシュで使用されているキー、値の一覧を配列として取得することができます。

#!C:\Perl\bin\Perl.exe

# ハッシュ作成
%hash = (
  "uni"      => "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーの配列を取得
@keys = keys( %hash );

print "Keys: ";

foreach ( @keys ) {
  print "$_, ";
}
print "\n";

# 値の配列を取得
@values = values( %hash );

print "Values: ";

foreach ( @values ) {
  print "$_, ";
}
 "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーの配列を取得
@keys = keys( %hash );

print "Keys: ";

foreach ( @keys ) {
  print "$_, ";
}
print "\n";

# 値の配列を取得
@values = values( %hash );

print "Values: ";

foreach ( @values ) {
  print "$_, ";
}]]>
実行結果
tekkadon : 500yen
uni : 100yen
tempura : 200yen

Keys: tekkadon, uni, tempura,
Values: 500yen, 100yen, 200yen,

exists, delete

existsはハッシュに指定したキーが存在するかを確かめます。 deleteはキーと値の対をハッシュから削除します。

#!C:\Perl\bin\Perl.exe

# ハッシュ作成
%hash = (
  "uni"      => "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーが存在するかを確かめる
if ( exists( $hash{"tempura"} ) ) {
  print "\"tempura\" exists in hash.\n";
}

# キーと値の対を削除
delete $hash{"tempura"};

print "\"tempura\" was removed.\n";

print "\n";

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーが存在するかを確かめる

if ( !exists( $hash{"tempura"} ) ) {
  print "\"tempura\" doesn't exists in hash.\n";
}
 "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーが存在するかを確かめる
if ( exists( $hash{"tempura"} ) ) {
  print "\"tempura\" exists in hash.\n";
}

# キーと値の対を削除
delete $hash{"tempura"};

print "\"tempura\" was removed.\n";

print "\n";

# 列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キーが存在するかを確かめる

if ( !exists( $hash{"tempura"} ) ) {
  print "\"tempura\" doesn't exists in hash.\n";
}]]>
実行結果
tekkadon : 500yen
uni : 100yen
tempura : 200yen

"tempura" exists in hash.
"tempura" was removed.

tekkadon : 500yen
uni : 100yen

"tempura" doesn't exists in hash.

ハッシュの列挙方法

ハッシュを列挙するには、eachを使ってキーと値の対を取得するか、keysによってキーの配列を用いてそれを列挙するかの二つの方法があります。

#!C:\Perl\bin\Perl.exe

# ハッシュ作成
%hash = (
  "uni"      => "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# each関数による列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キー配列による列挙
foreach ( keys( %hash ) ) {
  print "$_ : $hash{$_}\n";
}
print "\n";
 "100yen",
  "tempura"  => "200yen",
  "tekkadon" => "500yen"
);

# each関数による列挙
while ( ( $key, $value ) = each( %hash ) ) {
  print "$key : $value\n";
}
print "\n";

# キー配列による列挙
foreach ( keys( %hash ) ) {
  print "$_ : $hash{$_}\n";
}
print "\n";]]>
実行結果
tekkadon : 500yen
uni : 100yen
tempura : 200yen

tekkadon : 500yen
uni : 100yen
tempura : 200yen