(氏名からすべて入力してもらうということかもしれないが、とりあえず。)
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