-1

入力ファイルがあります

words;
yadda yadda;
keyword 123;
yadda;

変数として保存された値 123 を取得したいだけです。ここから解決策を試しました:

my $var;
open(FILE,$data.dat) or die "error on opening $data: $!\n";
while (my $line = <FILE>) {
        if (/^keyword/) {
                $var = $1;
                print $line;
                last;
        }
}
close(FILE);

これは機能せず、次のエラーが表示されます: Use of uninitialized value $_ in pattern match (m//) at ./script.pl line 91, <FILE> line 384.(これは のすべての行で発生します<FILE>)

私は、単に述べ@string = sort grep /^keyword/,<FILE>;て機能するif条件のない別の解決策を見つけました。ここで何が起こっているのか説明してもらえますか?

/編集

回答と解説ありがとうございます!より良い/よりエレガントな方法は何だと思いますか? grep または if 条件?

4

2 に答える 2

2

次の変更が必要です。

if ($line =~ m/^keyword\s+(\d+)/)

説明: $line を読み込んだため、一致のデフォルトのターゲットである $_ は定義されていません。さらに、パターンでキャプチャ グループが指定されていないため、$1 で別のエラーが発生します。

于 2013-07-30T13:26:45.257 に答える
2

$1最初のキャプチャ グループを参照しますが、正規表現にはキャプチャ グループが含まれていないため、未定義です。試す

if ($line =~ /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[Ee]-?(?:\d+|\d*\.\d*))?)/) {

先ほど読み取った行を含む変数に正規表現が適用されていることにも注意してください。

編集: 科学表記法の数値に対応するように更新されました。これは重要な追加要件であり、最初に明示的に指定する必要があります。

于 2013-07-30T13:25:40.357 に答える