Perl 为什么输出是这样的-劈
我很难理解下面代码的输出。 1.为什么输出为Jo Al Ch和Sa?切碎不会删除字符串的最后一个字符并返回该字符,所以输出不应该是nin和y吗?2.$firstline=0的用途是什么;代码中的行? 3.线路上到底发生了什么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
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";
}