Snippets

sironekotoro Perl入学式 2018 第3回 最終問題 region_ref.pl

Created by sironekotoro
#!/usr/bin/env perl
use strict;
use warnings;

# Perl入学式 2018 第3回 最終問題
# https://github.com/perl-entrance-org/workshop-2018/blob/master/3rd/slide.md
# 練習問題(region_ref.pl)

# 次の処理をする region_ref.pl を作りましょう。
# 1. 以下のデータ構造を表す%japanを作ってください。

# japan
#  ├─ tokyo
#  │    ├─ gotanda
#  │    └─ shibuya
#  ├─ osaka
#  │    └─ shinsaibashi
#  ├─ okinawa
#  │    ├─ naha
#  │    └─ yomitan
#  ├─ hokkaido
#  │    ├─ sapporo
#  │    └─ obihiro
#  └─ fukuoka
#        └─ hakata

# 2. 1.で作ったデータから、 gotanda と sapporo を出力してください。
# 3. osaka の中に umeda を追加してください。
# 4. その後、Data::Dumper を使って %japan 全体の中身を出力してください。

# 1. 以下のデータ構造を表す%japanを作ってください
# に従って、ハッシュを作る
my %japan = ();

# 問題文のツリー構造にはいろんな解釈の仕方があるが、今回は
#   key   : tokyo , osaka などの都道府県名
#   value : gotanda , sapporo などの都市名
#           valueは配列にして、複数の値を入れられるようにする
# と解釈した
# 以下様々な情報の格納の仕方を試す

# tokyo 配列を作成し、配列リファレンスにしてスカラー変数に格納
# 配列リファレンスを作っておく
my @tokyo_array = ( 'gotanda', 'shibuya' );
my $tokyo_ref = \@tokyo_array;

# osaka 無名配列をスカラー変数に格納
# 配列リファレンスを作っておく
my $osaka_ref = ['shinsaibashi'];

# okinawa qwショートカットで配列を作成する
# (注:ここでは配列を作っただけ)
my @okinawa_array = qw/naha yomitan/;

#
# ここから、ハッシュ%japanのkey,valueを設定していく
#

# ハッシュjapanのkey:tokyo に対するvalueとして、
# 配列リファレンスを格納
$japan{tokyo} = $tokyo_ref;

# ハッシュjapanのkey:osaka に対するvalueとして、
# \をつけた配列名、リファレンスした配列を格納
$japan{osaka} = $osaka_ref;

# ハッシュjapanのkey:okinawa に対するvalueとして、
# \をつけた配列名、リファレンスした配列を格納
$japan{okinawa} = \@okinawa_array;

# ハッシュjapanのkey:hokkaido に対するvalueとして、
# 無名配列を格納
$japan{hokkaido} = [ 'sapporo', 'obihiro' ];

# ハッシュjapanのkey:fukuoka に対するvalueとして、
# 無名配列を格納
$japan{fukuoka} = ['hakata'];


# gotanda アロー記法
print $japan{tokyo}->[0], "\n";    # gotanda
# sapporo アロー記法の省略
print $japan{hokkaido}[0], "\n";    # sapporo
# おまけ:yomitan 配列リファレンスをデリファレンスして
# 添え字で指定して表示する
print ${$japan{okinawa}}[1], "\n";    # sapporo


# $japan{osaka} にumeda を加える
# $japan{osaka}のvalueは配列リファレンスなので、
# 配列リファレンスをデリファレンスして配列に戻し、
# 配列に加える関数 push を用いて umeda という文字列を
# 加える
push @{$japan{osaka}} , 'umeda';

# おまけ: $japan{tokyo} に kichijyouji を加える
# 配列リファレンス内の要素数が分かっている場合には、
# 添え字を指定してアロー記法で直接要素を追加できる
$japan{tokyo}->[2] = 'kichijyouji';


use Data::Dumper;
print Dumper \%japan;

Comments (0)