「初めてのPerl」 3章 (リストと配列)

いつかはPlaggerを使いこな…bonlifeです。昨夜、今朝の電車で4章の途中まで読めました。とりあえず3章はリストって概念がなんだか分かりづらいです。(まぁ、リストなんですけどね。)qwショートカットもなんだか見慣れない感じですし。スカラーコンテキストとリストコンテキストについてはおよそ理解し(たつもりになり)ました。これはPerlを使っていくうちに慣れてくるんでしょうね。そんなこんなで、3章の演習問題を解いてみました。

ex3-1.pl

  • 何個か文字列を入力させ、その内容を逆順で表示する
#! perl -w
chomp(@lines = <STDIN>);
@lines = reverse @lines;
foreach $line (@lines) {
	print "$line\n";
}

出力結果は以下の通り。(^Zまでは入力)

ex3-1.pl
a
b
c
d
^Z
d
c
b
a

正解を見て気付いたことは以下の通り。

  • 入力を促すメッセージをprintしてあげた方が良い
  • 配列の値を逆順にしたものは別の配列に代入してあげた方が良さそう
  • chompなどしないで短く書くのがPerlの美学らしい

ex3-2.pl

  • 人名リストをプログラム中にハードコード
  • 数値を入力させ、その番号に対応する名前を出力
#! perl -w
@names = qw / fred betty barney dino wilma pebbles bamm-bamm /;
chomp(@numbers = <STDIN>);
foreach $number (@numbers) {
	print "$names[$number - 1]\n";
}

出力結果は以下の通り。(^Zまでは入力)

ex3-2.pl
1
2
4
2
^Z
fred
betty
dino
betty

正解を見て気付いたことは特になし。ほぼ同じ。
ex3-3.pl

  • 何個か文字列を入力させ、その内容をASCIIコード順に表示
  • すべての文字列の1行表示と文字列ごとに行を分ける表示を実現する
#! perl -w
chomp(@words = <STDIN>);
@words = sort @words;
if ( $ARGV[0] eq "-l" ) {
	$separator = "\n";
} else {
	$separator = " ";
}
foreach $word (@words) {
	print "$word$separator";
}

出力結果は以下の通り。(^Zまでは入力)

ex3-3.pl
fred
barney
wilma
betty
^Z
Use of uninitialized value in string eq at C:\test\perl\ex3-3.pl line 4, <STDIN> line 4.
barney betty fred wilma
ex3-3.pl -l
fred
barney
wilma
betty
^Z
barney
betty
fred
wilma

正解を見て気付いたことは以下の通り。

  • やっぱりchompせずに改行ごと出力するんですね
  • 引数で分けずに2つのパターンを考えれば良かったようです

こんな感じで続けてみます。O'reilly的正解を確認したい方はお近くの書店などで「初めてのPerl」をチェキってみてくださいませ。