1. ホーム
  2. perl

[解決済み] Perl で、$variable が定義され、長さが 0 でない文字列を含んでいるかどうかを簡潔に確認するにはどうしたらよいですか?

2023-04-12 13:29:50

質問

現在、以下のようなPerlを使って、変数が定義されているか、テキストが含まれているかをチェックしています。私はチェックする必要があります defined を最初にチェックして、'uninitialized value' 警告を回避しています。

if (defined $name && length $name > 0) {
    # do something with $name
}

もっと良い(おそらくもっと簡潔な)書き方はないのでしょうか?

どのように解決するのですか?

定義済みかどうかのチェックをよく見かけますが、これはundef値を使ったときの警告に対処する必要がないためです(Perl 5.10では問題のある変数を教えてくれますし)。

 Use of uninitialized value $name in ...

そのため、この警告を回避するために、人々はあらゆる種類のコードを考え出し、そのコードはバブルガムやダクトテープのようなものではなく、ソリューションの重要な部分のように見え始めるのです。時には、回避しようとしている警告を明示的にオフにすることで、自分が何をしているかを示す方が良い場合もあります。

 {
 no warnings 'uninitialized';

 if( length $name ) {
      ...
      }
 }

その他の場合は、データの代わりに何らかのNULL値を使用します。例えば Perl 5.10のdefined-or演算子は を使えば length を、警告を引き起こす変数の代わりに明示的な空文字列(定義され、長さゼロを返す)を与えることができます。

 use 5.010;

 if( length( $name // '' ) ) {
      ...
      }

Perl 5.12 では、もう少し簡単です。 length は未定義の値に対しても未定義を返すからです。 . それは少しばかげたことのように見えるかもしれませんが、それは私がなりたかったかもしれない数学者を喜ばせるものです。それは警告を発しない、それがこの質問が存在する理由です。

use 5.012;
use warnings;

my $name;

if( length $name ) { # no warning
    ...
    }