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

Regex perl字段内的替换

Regex perl字段内的替换,regex,perl,join,split,Regex,Perl,Join,Split,我需要解析许多分隔文件,我有一个问题。在while循环中,如何在字段中进行替换?让我给出一些示例代码和数据 数据示例: 单词、姓名、号码、你/我、数据 你好,乔希,123,我,数据 你好,乔,222,我,数据 目标: 在本例中,我想做的是对$[2]和$[3]进行替换 换句话说,字段$[2]将是数字字段$[3] 将是“你/我”字段 我的代码中包含以下内容: my @F = split; while (<>) { if ($F[3] =~ /^You$/ print "Me"

我需要解析许多分隔文件,我有一个问题。在while循环中,如何在字段中进行替换?让我给出一些示例代码和数据

数据示例:

单词、姓名、号码、你/我、数据
你好,乔希,123,我,数据
你好,乔,222,我,数据
目标:

在本例中,我想做的是对$[2]和$[3]进行替换

换句话说,字段$[2]将是数字字段$[3] 将是“你/我”字段

我的代码中包含以下内容:

my @F = split;

while (<>) {
    if ($F[3] =~ /^You$/ print "Me";) next;
    if ($F[2] =~ /^222$/ print "P";) next;
    if ($F[2] =~ /^123$/ print "P";) next;
    print @F;
}
我只想在指定的字段上执行替换,其他内容保持不变

此外,我可能会有一个场景,我想用完全不同的东西来划分某些字段,而其他一切都保持不变。我还想使用标量

数据示例:

单词、姓名、号码、你/我、数据
你好,乔希,123,我,数据
你好,乔,222,我,数据
预期结果:

单词、姓名、号码、你/我、数据
你好,Josh,P-Me,数据
你好,乔,P-Me,数据
带有标量的示例

my $numbers = qw/222|123/;
    my @F = split;

    while (<>) {
        if ($F[3] =~ /^You$/ print "Me";) next;
        if ($F[2] = /^$numbers$/ print "P";) next;
        join ("-",$[2],$[3]);
        print @F;
    }
my$numbers=qw/222 | 123/;
我的@F=分裂;
而(){
如果($F[3]=~/^You$/打印“我”;)下一步;
如果($F[2]=/^$numbers$/打印“P”;)下一步;
联接(“-”,$[2],$[3]);
打印@F;
}
因此,最后,我想知道如何替换in字段,使用不同的分隔符连接特定字段,并在这种拆分/连接脚本中实现标量。

是否将“you”更改为“Me”?您想要的结果表明您不喜欢更改,但您的代码却不喜欢更改

我想你可以使用
$F[2]=~s/^123$/p/
。请参见
perldoc perlre

如果您想使用在位版本,可能需要使用
$^I
变量。
请参见
perldocperlval

perl
脚本满足您的需要

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

my $file = "file";

local @ARGV = $file;
local $^I = '.bak';

my $numbers = qr/^(?:222|123)$/;
while (<>) {
    print and next if /^\s+$/ or $.==1;
    my @flds = split /,/;
    $flds[2] = "P" if $flds[2] =~ $numbers; 
    $flds[3] = "Me" if $flds[3] eq "You";  
    print join ",", @flds[0,1], join ("-", @flds[2,3]), @flds[4..$#flds];
}

#unlink "$file$^I";
我们使用
$^I
变量进行就地更改,同时创建扩展名为
.bak
的原始备份。我们在
上拆分行,并填充一个名为
@flds
的数组

然后,我们进行两次检查,如果检查成功,我们将对字段进行更改。检查完成后,我们打印数组,其中包含每个成功测试的修改字段

取消链接
被注释掉。如果不想备份文件,可以取消注释

您可以删除
print和next,除非/\S/

Word,Name,Number,You/Me,Data

Hello,Josh,P-Me,Data

Hello,Joe,P-Me,Data