2

私はPerlが初めてで、正規表現を行う必要があります。配列が整数値のように使用されると、内部の要素の数が得られます。

だから私は例えばやっています

if (@result = $pattern =~ /(\d)\.(\d)/) {....}

パターンマッチングが失敗した場合、空の配列を返す必要があると考えていましたが、2つの要素を持つ配列が得られますが、値は初期化されていません。

では、if条件の中にパターンマッチングを入れる方法はありますか?

編集:

foreach (keys @ARGV) {

    if (my @result = $ARGV[$_] =~ /^--(?:(help|br)|(?:(input|output|format)=(.+)))$/) {

        if (defined $params{$result[0]}) {
            print STDERR "Cmd option error\n";
        }

        $params{$result[0]} = (defined $result[1] ? $result[1] : 1);

    }
    else {
        print STDERR "Cmd option error\n";
        exit ERROR_CMD;
    }

}

これはコマンド ライン オプションの正規表現パターンです。cmd オプションは、前に 2 つのハイフンが付いた長い形式であり、引数を使用できるため、--CMD[=ARG] です。私はエレガントなソリューションが欲しいので、プロローグなどのないif条件に入れたいのです.

EDIT2:ああ、私は@result配列のグループは常に0から数えられると思っていましたが、アクセスできるのはパターンが成功しているブランチからのグループだけです。したがって、私のコード コマンドが「入力」の場合、それは $result[0] にあるはずですが、実際には $result[1] にあります。$result[0] が初期化されていない場合、パターンが失敗し、if ステートメントに進むと思いました。

4

3 に答える 3

3

次の点を考慮してください。

use strict;
use warnings;

my $pattern = 42.42;

my @result = $pattern =~ /(\d)\.(\d)/;

print @result, ' elements';

出力:

24 elements

Context は Perl に をどのように扱うかを伝えます@result。確かに24要素はありません!Perl は、正規表現のキャプチャから得られた配列の要素を出力しました。ただし、次のことを行う場合:

print 0 + @result, ' elements';

我々が得る:

2 elements

後者の場合、Perl は のスカラー コンテキストを解釈するため@result、要素の数を に追加し0ます。これは、 によっても実現できますscalar @results

修正された投稿に対応するように編集します。したがって、コードの条件は次のとおりです。

if(my @result = $ARGV[$_] =~ /^--(?:(help|br)|(?:(input|output|format)=(.+)))$/) { ...

true一致が成功した場合にのみ評価されます。

于 2013-02-19T18:57:03.913 に答える
2
@results = $pattern =~ /(\d)\.(\d)/ ? ($1,$2) : ();
于 2013-02-19T18:57:27.057 に答える
1

これを試して:

@result = ();
if ($pattern =~ /(\d)\.(\d)/)
{
 push @result, $1;
 push @result, $2;
}

=〜は等号ではありません。正規表現の比較を行っています。

したがって、上記の私のコードは、配列を空に初期化し、正規表現が一致する場合にのみ値を割り当てています。

于 2013-02-19T18:40:23.880 に答える