それじゃひとつになっとりませんがな
本筋とは全然関係ないですが、danさんのコードでは出口がふたつですよね。
sub search_result{ my $q = shift; if ($q->param("query")){ my $uri = URI->new($WEBAPI_BASEURL); $uri->query_form( appid => $MYYDN_APPID, query => $q->param("query"), results => $MAX_RESULTS ); my $response = LWP::Simple::get($uri); if ($response){ my $xml = XML::Simple->new->XMLin($response, ForceArray=>['Result']); my @result = ($xml->{'totalResultsAvailable'}, "hits"); push @result, "<ol>"; for my $r ( @{ $xml->{'Result'} } ){ push @result, encode_utf8(sprintf qq(<li><a href="%s">%s</a></li>), $r->{'ClickUrl'}, $r->{'Title'}); } push @result, "</ol>"; return @result; # 出口 } } # 出口 }
ほんとの出口ひとつコードはこんなんですよ。
sub search_result{ my $q = shift; my @result = (); if ($q->param("query")){ my $uri = URI->new($WEBAPI_BASEURL); $uri->query_form( appid => $MYYDN_APPID, query => $q->param("query"), results => $MAX_RESULTS ); my $response = LWP::Simple::get($uri); if ($response){ my $xml = XML::Simple->new->XMLin($response, ForceArray=>['Result']); push @result, ($xml->{'totalResultsAvailable'}, "hits"); push @result, "<ol>"; for my $r ( @{ $xml->{'Result'} } ){ push @result, encode_utf8(sprintf qq(<li><a href="%s">%s</a></li>), $r->{'ClickUrl'}, $r->{'Title'}); } push @result, "</ol>"; } } return @result; # 出口 }
んで、
「出口は一つ」がベストというのはよく聞く言葉なのだけど根拠がよくわからない。
出口ひとつコードのひとつのキモは関数のブラックボックス化を徹底できることでしょう。Perl5の場合はコンテキストが柔軟すぎていまいちありがたみを感じられませんが、上の例ならsearch_resultの返り値はかならず配列だよというのがコードの中間読まなくても明確にわかる。if文ばかりだとインデントがうるさいということであれば
sub search_result{ my $q = shift; my @result = (); { last unless $q->param("query"); my $uri = URI->new($WEBAPI_BASEURL); $uri->query_form( appid => $MYYDN_APPID, query => $q->param("query"), results => $MAX_RESULTS ); my $response = LWP::Simple::get($uri) or last; my $xml = XML::Simple->new->XMLin($response, ForceArray=>['Result']); push @result, ($xml->{'totalResultsAvailable'}, "hits"); push @result, "<ol>"; for my $r ( @{ $xml->{'Result'} } ){ push @result, encode_utf8(sprintf qq(<li><a href="%s">%s</a></li>), $r->{'ClickUrl'}, $r->{'Title'}); } push @result, "</ol>"; } return @result; # 出口 }
なんて書いてもよいですが、とにかく中がどうであろうと関数としての返り値(の型)はケツ見りゃわかる。途中でreturn undef;なんてものが混じることは規約的にありえない――ということにしておけば関数の型宣言するのと同じ効果が得られますでしょ、と。
#もちろんこれがいまどきのbest practiceかというと???ですけどね。