Perl 为什么输出是这样的-劈

Perl 为什么输出是这样的-劈,perl,Perl,我很难理解下面代码的输出。 1.为什么输出为Jo Al Ch和Sa?切碎不会删除字符串的最后一个字符并返回该字符,所以输出不应该是nin和y吗?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 2

我很难理解下面代码的输出。 1.为什么输出为Jo Al Ch和Sa?切碎不会删除字符串的最后一个字符并返回该字符,所以输出不应该是nin和y吗?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";
}
}

这个脚本没有什么问题,但首先我会回答你的观点

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

$firstline没有任何用处,因为它从未设置为1。因此,您可以删除if/else块

在第一行中,它逐个读取数组@data的所有元素。在第二行中,它将元素的内容拆分为字符,捕获前两个字符,并将它们分配给$name和$age变量,然后丢弃其余的字符。在最后一行中,我们将打印捕获的字符。 依我看,在第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";
}

这个脚本没有什么问题,但首先我会回答你的观点

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

$firstline没有任何用处,因为它从未设置为1。因此,您可以删除if/else块

在第一行中,它逐个读取数组@data的所有元素。在第二行中,它将元素的内容拆分为字符,捕获前两个字符,并将它们分配给$name和$age变量,然后丢弃其余的字符。在最后一行中,我们将打印捕获的字符。 依我看,在第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";
}