我需要解析许多分隔文件,我有一个问题。在while循环中,如何在字段中进行替换?让我举一些示例代码和数据。
数据示例:
Word,Name,Number,You/Me,Data
Hello,Josh,123,Me,Data
Hello,Joe,222,Me,Data
目标:
在这个例子中,我想做的是在$ [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;
}
我似乎无法找到在特定字段中进行替换的正确语法,并希望有人会有建议。我的结果的目标如下。
期望的结果:
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;
}
所以最后,我想知道如何在字段中替换,使用不同的分隔符连接特定字段,并在这种分割/连接脚本中实现标量。
答案 0 :(得分: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/;
行。
答案 1 :(得分:0)
你想改变&#34;你&#34;到了#34;我&#34;?您想要的结果表明您不想改变,但您的代码则不然。
我认为您可以使用$F[2] =~ s/^123$/P/
。见perldoc perlre
如果您想要就地版,也许您想使用$^I
变量。
见perldoc perlval