Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Perl_Replace - Fatal编程技术网

Regex Perl中的字符串替换

Regex Perl中的字符串替换,regex,string,perl,replace,Regex,String,Perl,Replace,我正在尝试对代码进行除臭。这段代码使用了很多长变量名,在运行代码时用有意义的名称替换它们 如何在搜索和替换时保持状态 例如,对于这样一条模糊的线: ${${"GLOBALS"}["ttxdbvdj"]}=_hash(${$urqboemtmd}.substr(${${"GLOBALS"}["wkcjeuhsnr"]},${${"GLOBALS"}["gjbhisruvsjg"]

我正在尝试对代码进行除臭。这段代码使用了很多长变量名,在运行代码时用有意义的名称替换它们

如何在搜索和替换时保持状态

例如,对于这样一条模糊的线:

${${"GLOBALS"}["ttxdbvdj"]}=_hash(${$urqboemtmd}.substr(${${"GLOBALS"}["wkcjeuhsnr"]},${${"GLOBALS"}["gjbhisruvsjg"]}-${$rrwbtbxgijs},${${"GLOBALS"}["ibmtmqedn"]}));
mappings.txt中有多个映射与上面的模糊行匹配,如:

$rrwbtbxgijs = hash_length;
$urqboemtmd = out;
在第一次运行时,它将在上面模糊的行中用hash_length替换$rrwbtbxgijs。现在,当它在外部while循环的下一次迭代中遇到第二个映射时,它将在模糊的行中将$urqboemtmd替换为out

问题是: 当它遇到第一个映射时,它进行替换。但是,当它在同一行中遇到另一个匹配字符串的下一个映射时,前面的搜索/替换结果就不存在了

它应该保留以前的替换。我该怎么做

我编写了一个Perl脚本,它将从mapping.txt中选择一个映射,并在整个模糊代码中搜索所有出现的映射,并将其替换为有意义的文本

以下是我编写的代码:

#! /usr/bin/perl

use warnings;

($mapping, $input) = @ARGV;

open MAPPING, '<', $mapping
    or die "couldn't read from the file, $mapping with error: $!\n";

while (<MAPPING>) {

    chomp;
    $line = $_;
    ($key, $value) = split("=", $line);
    open INPUT, '<', $input;

    while (<INPUT>) {

        chomp;
        if (/$key/) {

            $_=~s/\Q$key/$value/g;
            print $_,"\n";
        }
    }
    close INPUT;
}
close MAPPING;
#/usr/bin/perl
使用警告;
($mapping,$input)=@ARGV;

打开映射,只需告诉Perl不要解释$key中的字符:

s/\Q$key/$value/g

只需告诉Perl不要解释$key中的字符:

s/\Q$key/$value/g

要匹配字符串中的文字元字符,可以使用
quotemeta
或:

s/\Q$key\E/$replace/

要匹配字符串中的文字元字符,可以使用
quotemeta
或:

s/\Q$key\E/$replace/
考虑使用并逐步将变量名输入其配置文件,以了解它们的作用

我对你的救州请求有点困惑。你到底在做什么/你打算对输出做什么?这里有一个(未经测试的)在一个过程中完成所有替换的示例,如果有帮助的话

my %map;
while ( my $line = <MAPPING> ) {
    chomp $line;
    my ($key, $value) = split("=", $line);
    $map{$key} = $value;
}
close MAPPING;

my $search = qr/(@{[ join '|', map quotemeta, sort { length $b <=> length $a } keys %map ]})/;
while ( my $line = <INPUT> ) {
    $line =~ s/$search/$map{$1}/g;
    print OUTPUT $line;
}
my%map;
while(我的$line=){
chomp$行;
我的($key,$value)=拆分(“=”,$line);
$map{$key}=$value;
}
紧密映射;
my$search=qr/(@{[join'|',map quotemeta,sort{length$b length$a}键%map]});
while(我的$line=){
$line=~s/$search/$map{$1}/g;
打印输出$行;
}
考虑使用变量名,并在确定变量名的作用时逐步将其输入到配置文件中

我对你的救州请求有点困惑。你到底在做什么/你打算对输出做什么?这里有一个(未经测试的)在一个过程中完成所有替换的示例,如果有帮助的话

my %map;
while ( my $line = <MAPPING> ) {
    chomp $line;
    my ($key, $value) = split("=", $line);
    $map{$key} = $value;
}
close MAPPING;

my $search = qr/(@{[ join '|', map quotemeta, sort { length $b <=> length $a } keys %map ]})/;
while ( my $line = <INPUT> ) {
    $line =~ s/$search/$map{$1}/g;
    print OUTPUT $line;
}
my%map;
while(我的$line=){
chomp$行;
我的($key,$value)=拆分(“=”,$line);
$map{$key}=$value;
}
紧密映射;
my$search=qr/(@{[join'|',map quotemeta,sort{length$b length$a}键%map]});
while(我的$line=){
$line=~s/$search/$map{$1}/g;
打印输出$行;
}

谢谢。这是有效的,我已经更新了我的问题。你能检查一下吗?我需要保留换人阶段。例如,它一次在行中进行一次替换。当它在该行中发现另一个不同映射的出现时,它应该保留以前的状态。也就是说,它应该在找到匹配项时不断更新同一行。@NeonFlash我理解你说的每一个字,但不知道你的意思。“保留替代阶段”是什么意思?我想你的意思是你不能一次检查一把钥匙。您可以将输入文件存储在数组中,而不是为每次迭代打开文件。并将打印内容留到最后。谢谢。这是有效的,我已经更新了我的问题。你能检查一下吗?我需要保留换人阶段。例如,它一次在行中进行一次替换。当它在该行中发现另一个不同映射的出现时,它应该保留以前的状态。也就是说,它应该在找到匹配项时不断更新同一行。@NeonFlash我理解你说的每一个字,但不知道你的意思。“保留替代阶段”是什么意思?我想你的意思是你不能一次检查一把钥匙。您可以将输入文件存储在数组中,而不是为每次迭代打开文件。谢谢,它能用:)我已经更新了问题。你能检查一下并提出一个很好的解决方法吗?谢谢,它很有效:)我已经更新了这个问题。你能检查一下并提出一个好的解决方法吗?嗨,这看起来很有用,但它非常复杂。我很愿意花时间学习如何有效地使用它,但是目前,有没有办法让我目前的脚本工作?它能够正确地替换值,我只希望它保持状态。搜索/替换成功后,应将其保存。下一步,搜索/替换操作应该对上一步的结果起作用。@Neon Flash:请参阅answerHi中添加的示例/问题,这看起来确实有用,但非常复杂。我很愿意花时间学习如何有效地使用它,但是目前,有没有办法让我目前的脚本工作?它能够正确地替换值,我只希望它保持状态。搜索/替换成功后,应将其保存。下一个“搜索/替换”操作应适用于上一个的结果。@Neon Flash:请参见答案中添加的示例/问题