我是perl的新手,想问你一个问题:
我有一个带管道分隔符的文件和32个字段。我的客户想要添加一些我不需要的字段。
我知道是UNIX我会使用cut命令
在perl中是否有任何方法可以删除这些新字段,以便脚本可以使用该文件,就像它是旧格式一样?
以下是我的代码:
open (PRISM, "$infile") or die "Can't open $infile\n";
while ( <PRISM> ) {
last if /^PRISMEXP/;
next if /^(\s)*$/; # skip blank lines
chomp;
"
/^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"
问题是,这条线应该怎么做?
答案 0 :(得分:0)
这取决于处理文件的代码,但您尚未显示。
但是,让我们想象它会像下面这样做:
my @fields = split /\|/, $input_line;
如果您只想保留其中的前32个,请将其更改为
my @fields = (split /\|/, $input_line)[0 .. 31];
答案 1 :(得分:0)
这是一个过滤器,它将采用第2,第4,第6,第8,第11和第16列,并去除其余部分,然后将其重新换成以管道分隔的格式:
cat input.inp | perl -ne 'print join( q(|), (split /[|]/)[1,3,5,7,10,15])' > outfile.out
当然,您可以使用autosplit开关执行此操作,然后可以在@F
中找到该数组:
cat input.inp | perl -F'|' -ne 'print join( q(|), @F[1,3,5,7,10,15])' > outfile.out
答案 2 :(得分:0)
正则表达式是一个字符串:
"
/^((?:.*?\|){3}?)((?:.*?\|){5}?)((?:.*?\|){14}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){2}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)((?:.*?\|){1}?)(.*?)$/;"
正则表达式没有做任何事情。它只是一个什么都不做的字符串。
您应该将use warnings; use strict;
放在每个程序的顶部。在这种情况下,use warnings;
会向您显示消息Useless use of a constant ("your regex") in void context at ...