15

私はPerlにまったく慣れていません。外部モジュール HTTP::BrowserDetect を使用する必要がありました。いくつかのコードをテストしていて、os_string メソッドから OS の名前を取得しようとしました。そのため、単純にオブジェクトを初期化し、返された値を格納する変数を作成しました。

my $ua = HTTP::BrowserDetect->new($user_agent);
my $os_name = $ua->os_string();

print "$user_agent $os_name\n";

一部のユーザー エージェントはブラウザ ユーザー エージェントではないため、os_string から値を取得できません。エラーが発生しますUse of uninitialized value $os_name in concatenation (.) or string

メソッド os_string が undef を返すために $os_name が初期化されていない場合、どのように処理すればよいでしょうか (これは、モジュールのソース コードを読むことで起こると思います)。これらの場合、たとえば No OS など、デフォルトの文字列を指定する方法が必要だと思います。

4

3 に答える 3

30

注意: 元の回答のアプローチ ( $var = EXPRESSION || $default_value) では、式から返されるすべての「Perl false 値」のデフォルト値が生成されます。たとえば、式が空の文字列の場合は、代わりにデフォルト値を使用します。

あなたの特定の例では、それはおそらく正しいことです(OS名は空の​​文字列であってはなりません)が、一般的には、実際に必要だったのが代わりにデフォルト値のみを使用することであった場合、バグになる可能性がありますundef

valuesのみを避けたいundefが、空の文字列やゼロは避けたい場合は、次のようにします。

  • Perl 5.10 以降: 「定義済み OR 演算子」( //) を使用します。

    my $os_name = $ua->os_string() // 'No OS';
    
  • Perl 5.8 以前: defined-or がまだ使用できなかったため、条件演算子を使用します。

    my $os_string = $ua->os_string(); # Cache the value to optimize a bit
    my $os_name = (defined $os_string) ? $os_string : 'No OS';
    # ... or, un-optimized version (sometimes more readable but rarely)
    my $os_name = (defined $ua->os_string()) ? $ua->os_string() : 'No OS';
    

このトピックの詳細 ( に関する詳細を含む//) は、brian d foy の投稿 ( http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or ) にあります。 -オペレーター/

于 2010-10-18T13:33:28.833 に答える
21
my $os_name = $ua->os_string() || 'No OS';

が偽の場合$ua->os_string()(つまりundef、 、ゼロ、または空の文字列)、||式の 2 番目の部分が評価されます (式の値になります)。

于 2010-10-18T12:26:16.230 に答える
1

お探しdefinedですか?

于 2010-10-18T13:33:49.317 に答える