为什么输出是这样的? - 分裂和砍

时间:2018-02-13 03:26:22

标签: perl

我无法理解以下代码的输出。 1.为什么输出Jo Al Ch和Sa?不会删除字符串的最后一个字符并返回该字符,所以输出不应该是n和n吗? 2. $ firstline = 0的目的是什么;在代码中行? 3.究竟发生了什么?

foreach(@data) 
{$name,$age)=split(//,$_);
print "$name $age \n";     

以下代码的输出是

文件中的数据是:

J o
A l
C h
S a

文件内容为:

NAME AGE
John 26
Ali 21
Chen 22
Sally 25

代码:

#!/usr/bin/perl
my ($firstline,
@data,
$data);

open (INFILE,"heading.txt") or die $.;

while (<INFILE>)
{
if ($firstline)
{
$firstline=0;
}
else
{
chop(@data=<INFILE>);
}
print "Data in file is: \n";
foreach (@data)
{
($name,$age)=split(//,$_);
print "$name $age\n";
}
}

1 个答案:

答案 0 :(得分:4)

此脚本存在一些问题,但首先我将回答您的观点

  1. chop将删除字符串的最后一个字符并返回切碎的字符。在您的数据文件“heading.txt”中,每一行都可能以\n结尾,因此chop将删除\n。始终建议使用chomp代替。 您可以通过运行以下命令来验证该行的最后一个字符:

    od -bc heading.txt
    
    0000000 116 101 115 105 040 101 107 105 012 112 157 150 156 040 062 066
              N   A   M   E       A   G   E  \n   J   o   h   n       2   6
    
    0000020 012 101 154 151 040 062 061 012 103 150 145 156 040 062 062 012
             \n   A   l   i       2   1  \n   C   h   e   n       2   2  \n
    
    0000040 123 141 154 154 171 040 062 065 012
              S   a   l   l   y       2   5  \n
    
    0000051
    

    您可以看到\n

  2. 没有使用$firstline,因为它从未被设置为1.因此您可以删除if/else块。

  3. 在第一行中,它逐个读取数组@data的所有元素。在第二行中,它将字符的内容拆分为字符并捕获前2个字符,并将它们分配给$name$age变量并丢弃其余部分。在最后一行,我们将打印这些捕获的字符。 IMO,在第2行我们应该根据空间进行拆分,以实际捕获名称和年龄。 所以最终的脚本应该是这样的:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @data;  
    open (INFILE,"heading.txt") or die "Can't open heading.txt: $!";
    while (<INFILE>) {
        chomp(@data= <INFILE>);
    }
    close(INFILE);
    
    print "Data in file is: \n";
    foreach (@data) {
        my ($name,$age)=split(/ /,$_);
        print "$name $age\n";
    }
    

    <强>输出:

    Data in file is:
    John 26
    Ali 21
    Chen 22
    Sally 25