16章(単純なデータベース) 練習問題2

コマンドラインからPerl関数の名前を1個受け取って、perlfunc.podファイルの中でその関数が最初に現れる=item行の行番号を表示するプログラムを書いてください。

自作コードはこちら。

#!/usr/bin/perl
use strict;
use warnings;

my $function = shift;
dbmopen(my %DATA, "perlfunc", 0644) or die "cannot open perlfunc: ($!)";

if ($DATA{$function}) {
    print "$functionは$DATA{$function}行に存在します\n";
}
else {
    print "$functionは存在しますせん\n";
}

出力結果はこちらになります。

C:\Perl\hajip>ex16-2.pl pop
popは3745行に存在します

C:\Perl\hajip>ex16-2.pl wantarray
wantarrayは6663行に存在します

C:\Perl\hajip>ex16-2.pl hoge
hogeは存在しますせん

C:\Perl\hajip>ex16-2.pl piyo
piyoは存在しますせん

C:\Perl\hajip>

それでは解答チェックに行きます。
…うお、16章(単純なデータベース) 練習問題1 - ABラボラトリで知ったテクニックを使って物凄いスマートに書いてある。
改良すると以下のコードになりました。

#!/usr/bin/perl
use strict;
use warnings;

my $function = shift;
dbmopen(my %DATA, "perlfunc", 0644) or die "cannot open perlfunc: ($!)";
my $line = $DATA{$function} || 'not found';
print "$function: $line\n";


肝の部分は

my $line = $DATA{$function} || 'not found';

ここ。短絡演算子をうまく活用することで長ったらしいif文がなくなっていますね。