続・4章 練習問題

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;
    }
}

サブルーチンに渡す/渡されるものは何か、それを使うにはどうするか、を一つずつ順を追って考えていけばすぐ書けた。