我无法理解以下代码的输出。 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";
}
}
答案 0 :(得分:4)
此脚本存在一些问题,但首先我将回答您的观点
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的所有元素。在第二行中,它将字符的内容拆分为字符并捕获前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