1

フィートとインチのサイズをインチ単位の幅とインチ単位の高さの別々の列に変換するスクリプトを .csv ファイルで実行しようとしています。

厳格モードを使用していない場合は問題なく動作しますが、use warnings;設定すると警告メッセージが返されます。

私の問題はここで発生します:

if ($data[$index_num] =~ /(\d+)'( (\d+)'')? x (\d+)'( (\d+)'')?/) {

    my $width = $1*12+$3;
    my $height = $4*12+$6;

    ...
}

サイズが 5' x 8' になる場合があるため、特殊変数 $3 および $6 は存在しません。

可能なすべてのサイズ形式は次のとおりです。

  1. 5' 1'' x 6' 7'' (すべて一桁)
  2. 10' 1'' x 5' 10'' (1 桁と 2 桁の組み合わせ)
  3. 5フィート x 8フィート (インチなし)。
  4. 4' 6'' x 7' (インチなしとインチの組み合わせ)

私が受け取る警告は次のとおりです。

script.pl の 47 行目、567 行目で、初期化されていない値 $6 に加えて (+) が使用されています。

これは、幅または高さのいずれかでインチが欠落しているケース 3 または 4 のいずれかで発生しています。

$3 または $6 を使用する前に、それらが存在するかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

12

関数を使用できdefinedます:

my $height;
if(defined($6))
{
    $height = $4*12+$6;
}
else
{
    $height = $4*12;
}
于 2013-07-18T15:28:18.497 に答える
10

まず、役に立たないキャプチャを取り除きましょう。

/(\d+)'(?: (\d+)'')? x (\d+)'(?: (\d+)'')?/

一致しなかったキャプチャは に設定されるため、またはundefを使用できます。defined//

my $width  = $1 * 12 + ($2 // 0);
my $height = $3 * 12 + ($4 // 0);

//Perl 5.10 で導入されました。後方互換性のために、以下を使用できます。

my $width  = $1 * 12 + ($2 || 0);
my $height = $3 * 12 + ($4 || 0);

2 番目のバージョンでは、$2(or $4) が false (undef、ゼロ、または空の文字列) の場合、undef ではなくゼロを使用しますが、ここではまったく問題ありません。

于 2013-07-18T16:05:32.977 に答える
3

数字をテストしたいだけで、一致するものがない場合でも結果を計算したい場合は、次のように言えます。


if ($data[$index_num] =~ /(\d+)\'( (\d+)\'\')? x (\d+)\'( (\d+)\'\')?/) {

    my $width = ( $1 || 0 ) * 12 + ( $3 || 0 );
    my $height = ( $4 || 0 ) * 12 + ( $6 || 0 );

    ...
}

なぜこれが機能するのですか?たとえば、$1が未定義の場合($1 || 0)、右辺または を返すため0です。同様に、$1ゼロの場合、OR 条件の左側も失敗しますが、0それでも返されます。が$1ゼロ以外で定義されている場合、左辺が返されます ( $1)。

この手法を使用||する場合は、演算子の優先順位の副作用を避けるために、左側と右側を必ず括弧で囲んでください。

于 2013-07-18T16:09:01.453 に答える