[perl] 初めてのPerl 第15章

練習問題の回答をメモ。

ex15-1
#!/usr/bin/perl
my @numbers = qw( 17 1000 04 1.50 3.14159 -10 1.5 4 2001 90210 666 );

my @sorted_numbers = sort {$a <=> $b} @numbers;
printf "%20s\n", $_ foreach (@sorted_numbers);

%s だと文字列として扱われるけど、%g だと必要に応じて自動的に浮動小数点数、整数、指数形式のどれかを選んでくれるよ(p114)。

ex15-2
#!/usr/bin/perl
use strict;

my %last_name = (
  "fred" => "flintstone",
  "Wilma" => "Flintstone",
  "Barney" => "Rubble",
  "betty" => "rubble",
  "Bamm-Bamm" => "Rubble",
  "PEBBLES" => "FLINTSTONE",
);

sub by_last_name {
  "\L$last_name{$a}" cmp "\L$last_name{$b}" or "\L$a" cmp "\L$b";
}
my @sorted_first_names = sort by_last_name keys %last_name;

print "$_ $last_name{$_}\n" foreach (@sorted_first_names);
ex15-3
#!/usr/bin/perl
use strict;

print "Enter a string: ";
chomp(my $str = <STDIN>);

print "Enter a sub string: ";
chomp(my $sub_str = <STDIN>);

# 何も代入されていない配列の値は()、つまり空リスト(p.54)
my @places;
# 裸のブロックで $idx のスコープを限定する(これは答えを見てから付け足した)
{
  my $idx = index($str, $sub_str);
  until ( $idx == -1) {
    push @places, $idx;
    #  print "$idx\n";
    $idx = index($str, $sub_str, $idx + 1);
  }
}

# 配列をスカラーコンテキストで使うと、配列の要素数が得られる(p.60)
if (@places) {
  print "The indexes of <<$sub_str>> in <<$str>> were <<@places>>\n";
} else {
  print "There were no <<$sub_str>> in <<$str>>\n";
}

広いスコープで使われる変数は長い名前を付けよう。この例で言うと、$str は $string の方がよかったかもしれないね。

反省点

この章とは直接関係無いけど、スカラー変数、配列の初期値などに何が入っているかうろ覚えだったので、基本的なところをしっかり見直そう。
新しいまっさらなスカラー変数は undef としてスタートするよ。
新しいまっさらな配列は ()、つまり空リストとしてスタートするよ。
詳しくは p.54 を参照。