Tuesday, August 10, 2010

learning perl exercise 6 hash

6-1:ユーザが入力した名前の姓を表示。
(氏名からすべて入力してもらうということかもしれないが、とりあえず。)

use 5.010;

my %family_name = (
"fred" => "flintstone" ,
"barney" => "rubble" ,
"wilma" => "flintstone",
);

print "Hey, type one of the names below and you know the person\'s last name.\n";

my @first_name = keys %family_name;
print "@first_name\n";

chomp ($person = <STDIN>);

print  "family name of $person is $family_name{$person}.\n";



6-2:名前のリストを読み込んで誰が何回登場したか表示。
use 5.010;

open IN, "namelist";

while ( $name = <IN> ) {
 chomp $name;
 if ( exists $namelist{$name} ) {
   $namelist{$name} = $namelist{$name} + 1;
  }
  else {
   $namelist{$name} = 1;
   }
 }
 
foreach $person (sort keys %namelist ) {
print "$person appeared $namelist{$person} time(s) in the list.\n";
}
動いた。

6-3
ENVのすべてのキーとその値を表示する。列幅は最大文字数のキーと値を取得してあわせる。
#! /usr/bin/perl
use 5.010;

my @key = sort keys %ENV;
my @value = values %ENV;

my $digit_key = &max_digit(@key);
my $digit_val = &max_digit(@value);

my $max_digit = 0;

sub max_digit {#最大値を返すサブルーチン
 foreach (@_){
  my $scales = length($_);
  if ($scales > $max_digit) {
   $max_digit = $scales;
  }
 }
 $max_digit;
}

$format = "%${digit_key}s %${digit_val}s\n";

while ( ($key, $value) = each %ENV) {#ハッシュENVのキーと値を最後の行まで代入
 printf $format, $key , $value;
}

回答例を見てあまりの短さに驚いた。

答え合わせ

6-3:
回答例はkeys %ENVの最大文字数だけを取得。

foreachで%ENVのkeyを取得すると同時にifで最大文字数を取得。
foreach my $key ( keys %ENV ) { 
 my $key_length = length( $key ) ;#$keyの文字数を代入。
 $longest = $key if $key_length > $longest;# ifのカッコなし
}


memo


ハッシュはキーと値がペアになった配列。データベース的な配列?
fredのfamily_nameはadamsの場合
$family_name{fred} = "adams";

複数同時に代入する場合(=>(fat array)を使う場合)
my %family_name (
"fred" => "adamas",
"mike" => "mann",
"alex" => "rodrigues",
"jimmy" => "carter",
);
行末がコンマ。

図書館の貸し出しカード。誰(key)が何冊(value)借りているか?

同じ名前が何回出てきたか?(名前をkey、回数をvalue)

初出の場合はundefを返すのでその分岐を利用するケース。

ハッシュの全処理にはeach %hash
while ( ($key, $value) = each %ENV) {#ハッシュENVのキーと値を最後の行まで代入
 printf $format, $key , $value; #あらかじめ決めたformatでキーと値を出力する例。
}

No comments:

Post a Comment