【问题标题】:substitution within fields perlperl 字段内的替换
【发布时间】:2014-08-19 16:36:32
【问题描述】:

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

数据示例:

Word,Name,Number,You/Me,Data
Hello,Josh,123,Me,Data
Hello,Joe,222,Me,Data

目标:

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

换句话说,字段 $[2] 将是数字字段。 $[3] 将是 You/Me 字段。

我的代码是这样的:

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;
}

我似乎找不到在特定字段中进行替换的正确语法,希望有人能提出建议。我的结果目标如下。

期望的结果:

Word,Name,Number,You/Me,Data
Hello,Josh,P,Me,Data
Hello,Joe,P,Me,Data

我只想对指定的字段执行替换,而其他所有内容保持不变。

另外,我可能有这样一种情况,我想用完全不同的东西来分隔某些字段,而其他一切都保持不变。我也想使用标量。

数据示例:

Word,Name,Number,You/Me,Data
Hello,Josh,123,Me,Data
Hello,Joe,222,Me,Data

期望的结果:

Word,Name,Number,You/Me,Data
Hello,Josh,P-Me,Data
Hello,Joe,P-Me,Data

标量示例

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;
    }

所以最后,我想知道如何在字段中进行替换,使用不同的分隔符连接特定字段,以及在这种拆分/连接脚本中实现标量。

【问题讨论】:

    标签: regex perl join split


    【解决方案1】:

    这个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";
    

    输出:

    Word,Name,Number,You/Me,Data
    
    Hello,Josh,P-Me,Data
    
    Hello,Joe,P-Me,Data
    

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

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

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

    如果您的文件中没有任何空行或者您不希望在输出中保留它们,您可以删除print and next unless /\S/; 行。

    【讨论】:

      【解决方案2】:

      你想把“你”改成“我”吗?你想要的结果表明你不想改变,但你的代码却不然。

      我认为你可以使用$F[2] =~ s/^123$/P/。见perldoc perlre

      如果您想要就地版本,也许您想使用$^I 变量。 见perldoc perlval

      【讨论】:

        猜你喜欢
        • 2019-02-06
        • 2019-10-31
        • 2016-07-28
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2014-10-06
        • 2022-01-02
        相关资源
        最近更新 更多