0

好的,我已经检查了以前的类似问题,并且我一直在处理不同的quotemeta 变体,但有些东西仍然不正确。

我有一个单词 ID 和两个单词的一行 - 第一个是错误的单词,第二个是正确的。我正在使用正则表达式用正确的单词替换错误的单词。

$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

预计到达时间:

既然你得到:

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 回答
3
  • 如果您使用过strict它会告诉您必须声明变量$xAS$xASA.
  • 如果您使用过warnings,它会告诉您您正在连接一个未初始化的变量。

因此,常见的警告是:“使用严格,使用警告”。

您只需要将字符串放在非插值引号( '', )中q{}转义符号( $) 以便它不会尝试插值它认为是变量的内容。

  • ""是会弄乱你的字符串的引号
  • ''是不会的引号

教训:除非你想要插值,否则使用单引号。

于 2012-04-06T15:41:08.777 回答
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 回答