Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用带有特殊字符的变量替换perl正则表达式_Regex_Perl_Special Characters - Fatal编程技术网

Regex 使用带有特殊字符的变量替换perl正则表达式

Regex 使用带有特殊字符的变量替换perl正则表达式,regex,perl,special-characters,Regex,Perl,Special Characters,好的,我已经检查了以前类似的问题,我一直在处理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

好的,我已经检查了以前类似的问题,我一直在处理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
因为
$
字符。

ETA:

自从你得到:

ANN20021015_0104_XML_16_21      A   A
当您需要时:

ANN20021015_0104_XML_16_21      A$xASA   A$xASA
我的怀疑如下:

  • 您不是有意插入变量
    $xAS
    $xASA
    ,因此,由于它们未定义,它们只是将空字符串添加到输出中可见的
    $line
    。例如,
    “A$xAS”
    扩展为
    “A”。取消定义
  • 您没有使用
    使用警告
    ,因此无法获取有关此错误的信息
解决方案:

使用
严格使用;使用警告。总是它们为你节省了很多时间

赋值时,请使用单引号,以避免插入变量:

$line = 'ANN20021015_0104_XML_16_21 A$xAS   A$xASA';
旧答案:

既然你没有说什么地方出了问题,那只是我这边的猜测

我可以看到变量
$xAS
$xASA
可能意外插入,您可以通过转义美元符号或在
$line
赋值上使用单引号来解决

您还可以使用
join
而不是正则表达式来构建新字符串,例如:

$line = join "\t", @splits[0,2,2];

问题不在于你的替代;问题就在代码示例的第一行

$line = "ANN20021015_0104_XML_16_21 A$xAS   A$xASA";
尝试将变量
$xAS
$xASA
插入
$line
,但不插入任何内容,因为这些变量为空。使用单引号而不是双引号,这样字符串就不会插值

如果您打开了
警告
,它会警告您正在插入未初始化的变量,如果您打开了
严格的“vars”
,它就不会允许您使用未声明的
$xAS
$xASA

最后,您不必
quotemeta
替换的右侧;只有左边。

  • 如果您使用了
    strict
    ,它会告诉您必须声明变量
    $xAS
    $xASA
  • 如果您使用了
    警告
    ,它会告诉您连接的是一个未初始化的变量
因此有一条常见的警告:“严格使用,警告使用”

您只需将字符串放入(
'
q{}
)或转义sigil(
$
),这样它就不会尝试将它认为是变量的内容

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

课程:除非需要插值,否则请使用单引号

你有什么迹象表明你所做的事情有问题?给出错误、预期输出和实际输出。是要插入到
$line
中的
$xAS
$xASA
变量吗?否则,第一行需要用单引号括起来!它们实际上是在插值两个变量,
$xAS
$xASA
,而不是
$x
。仅在需要插值时使用双引号。:)