4-1
次の式のうち異なる参照先はいくつあるでしょうか。
$ginger->[2][1] ${$ginger[2]}[1] $ginger->[2]->[1] ${$ginger->[2]}[1]
1番目は、3番目から「添え字的なもの」の間にある矢印を省略したもの。3番目は、4番目をブレースによる参照から矢印による参照に書き直したもの。よって、1番目、3番目、4番目は同じ。
2番目は、配列の3個目の要素にある、配列へのリファレンスの2個目を参照している。
4-2
check_required_items
を活用して、引数としてハッシュリファレンスだけ取るcheck_items_for_all
サブルーチンを書く。
#!/usr/bin/perl use strict; use warnings; my @gilligan = qw/ red_shirt hat lucky_socks water_bottle /; my @skipper = qw/ blue_shirt hat jacket preserver sunscreen /; my @professor = qw/ sunscreen water_bottle slide_rule batteries radio /; my %all = ( Gilligan => \@gilligan, Skipper => \@skipper, Professor => \@professor, ); check_items_for_all(\%all); sub check_items_for_all { my $who = shift; for my $name (keys %$who) { check_required_items( $name, $who->{$name} ); } } sub check_required_items { my $who = shift; my $items = shift; my @required = qw/ preserver sunscreen water_bottle jacket /; my @missing = qw//; for my $item (@required) { unless ( grep $item eq $_, @$items ) { # not found in list? print "$who is missing $item.\n"; push @missing, $item; } } if (@missing) { print "Adding @missing to @$items for $who.\n"; push @$items, @missing; } }
サブルーチンに渡す/渡されるものは何か、それを使うにはどうするか、を一つずつ順を追って考えていけばすぐ書けた。