0

以前の同様の質問を確認し、さまざまなバリエーションの引用メタをジャグリングしてきましたが、まだ何かが正しくありません。

単語 ID と 2 つの単語を含む行があります。最初の単語は間違った単語で、2 番目の単語は正しい単語です。そして、正規表現を使用して間違った単語を正しい単語に置き換えています。

$line = "ANN20021015_0104_XML_16_21 A$xAS   A$xASA";
@splits = split("\t",$line);
$wrong_word = quotemeta $splits[1];
$right_word = quotemeta $splits[2];
print $right_word."\n";
print $wrong_word."\n";

$line =~ s/$wrong_word\t/$right_word\t/g;

print $line;

私がやっていることの何が問題になっていますか?

編集

問題は、完全な単語を保持できないことです。単語は特殊文字で切り捨てられます。このコードは、特殊文字を含まない単語に対して完全に機能します。

上記の例に必要な出力は次のとおりです。

ANN20021015_0104_XML_16_21      A$xASA   A$xASA

しかし、私が得るのは

ANN20021015_0104_XML_16_21      A   A

$キャラだから。

4

3 に答える 3

3
  • 使用した場合は、変数とをstrict宣言する必要があると言われます。$xAS$xASA
  • を使用warningsした場合は、初期化されていない変数を連結していることがわかります。

したがって、一般的な警告:「厳密に使用し、警告を使用する」。

文字列を補間されていない引用符''q{})に入れるか、シジル( )をエスケープして、変数と見なされるものを補間しようとしないようにする必要があります。$

  • ""文字列を台無しにする引用符です
  • ''しない引用符です

レッスン:補間が必要でない限り、一重引用符を使用してください。

于 2012-04-06T15:41:08.777 に答える
3

到着予定時刻:

あなたが得るので:

ANN20021015_0104_XML_16_21      A   A

君が望む時に:

ANN20021015_0104_XML_16_21      A$xASA   A$xASA

私の疑惑は次のとおりです。

  • 変数$xASと を意図的に補間していない$xASAため、それらは未定義であるため、空の文字列を に追加するだけ$lineで、出力に表示されます。たとえば"A$xAS"、 に展開され"A" . undefます。
  • を使用しuse warningsていないため、このエラーに関する情報は取得できません。

解決:

を使用しuse strict; use warnings;ます。いつも。彼らはあなたの時間を大幅に節約します。

割り当てるときは、代わりに一重引用符を使用して、変数の補間を回避します。

$line = 'ANN20021015_0104_XML_16_21 A$xAS   A$xASA';

古い答え:

あなたは何がうまくいかないのか言わないので、それは私の側からの推測にすぎません.

$xAS変数との偶発的な補間の可能性を確認できます$xASA。これは、ドル記号をエスケープするか、その$line代入で一重引用符を使用することで解決できます。

join正規表現ではなく、を使用して新しい文字列を作成することもできます。

$line = join "\t", @splits[0,2,2];
于 2012-04-06T13:39:52.607 に答える
1

問題はあなたの代用ではありません。問題はコード例の最初の行にあります。

$line = "ANN20021015_0104_XML_16_21 A$xAS   A$xASA";

$xASは変数と$xASAをに補間しようとし$lineますが、これらの変数は空であるため何も補間しません。文字列が補間されないように、二重引用符の代わりに単一引用符を使用します。

オンにwarningsすると、初期化されていない変数を補間しているという事実について警告され、オンにするとstrict 'vars'、宣言されていない変数をまったく使用できなくなります。$xAS$xASA

quotemeta最後に、置換の右側にある必要はありません。左だけ。

于 2012-04-06T15:13:11.930 に答える