[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 の方がよかったかもしれないね。