在while循环perl中做多个事情

时间:2014-08-21 17:19:52

标签: perl join while-loop split

我在下面有一个相对简单的分割/连接脚本。第一部分删除了我的数据中的标题行第二部分是拆分\ t分隔文件并重新加入我选择的模板序列。在我加入字段后,我可以对任何重新加入的单个字段做任何事情吗?

当我运行这样的代码时,它只会执行脚本的第一部分,即连接。有什么建议吗?

示例数据

Id  Name    date    amount  me/you  
1   jim 10/31/2014  78392   you
1   jim 10/31/2014  0   you

所需的输出

y,1,jim,2014-10-31,78392,yes

初始代码

while (<>) {
    print and next if s/(^Pre-exisitng_Header_row*?\n|^$|^\s$)//; ##gets rid of header row/blanks
    my @flds = split /\t/; ##initiates split
    print join ",", @flds[5,1,2,3,4,5]; ##re joins to my liking.
}

所需代码

use text::trim

        while (<>) {
            print and next if s/(^Pre-exisitng_Header_row*?\n|^$|^\s$)//;  ##gets rid of header/blanks.
            my @flds = split /\t/; ##initiates split
    trim for @flds[0,2..$#flds];
            print join ",", @flds[5,1,2,3,4,5]; ##re joins to my liking. to retain $[5] as is

           print if ($flds[4] != 0) ##after re joining, print if $[4] is not = to 0.
            if ($flds[3] =~ s/(\d+)\/(\d+)\/(\d+)/$3-$1-$2/; ##do a regex on [3]
    $flds[0] = "Y" if $flds[0] =~ /you/; ##do a substitution on [0]

            print @flds;
        }

进一步说明

基本上我想做的就是拆分并重新加入我的数据到某个模板。在这个模板之后,我想修改字段。例如,你可以看到我想打印当且仅当$ [4]不等于0.其次我想确保日期是yyyy-mm-dd格式$ [3]。最后,我想将$ [0]从Yes替换为'Y',同时在我的新模板的最后一个字段中保留'Yes'($ [5])。

2 个答案:

答案 0 :(得分:0)

您可以对@flds数组的成员执行任何操作。

print join ",", @flds[1,2,3,4,5]; 

不修改@flds数组

答案 1 :(得分:0)

这是让你开始的东西。您还没有提到YYes关键字的位置,因为您的输入数据似乎没有。此外,还不是很清楚是否要按原样打印标题和空白行,或者您想要从输出中删除它们。我已经选择了后者,但如果你需要前者,它应该是一个简单的解决方案。还要记住,数组的索引从0开始。因此,您的第一列是array[0],而不是array[1]

要回答有关特定列为0的过滤行以及对某些数组元素执行更改的主要问题,以下内容应该为您提供一些想法:

use strict;
use warnings;

while(<DATA>) {
    next if /^\s+$|^\s*Id/;
    chomp;
    my @flds = split /\t/;
    next if $flds[3] eq 0;
    $flds[2] =~ s|(\d{2})/(\d{2})/(\d{4})|$3-$1-$2|;
    my $pre = "y" if $flds[4] eq "you";
    print join (",", $pre //= "", @flds) , "\n";
}

__DATA__
Id      Name    date    amount  me/you


1       jim     10/31/2014      78392   you

1       jim     10/31/2014      0       you

输出:

y,1,jim,2014-10-31,78392,you

要为该行添加前缀,您只需创建一个新变量,并根据该列的值设置它的值。 //=是已定义的或运算符。如果定义了变量的值,它将使用它。而不是"",您可以设置一个默认值,它可以在未定义时使用。

使用正则表达式的另一种方法是split。您可以从上面的代码中删除最后两行,并将其替换为以下内容。

my @dates = split /\//, $flds[2];
print join (",", @flds[0..1], join ("-", @dates[2,0,1]), @flds[3..4]), "\n";