我有一个格式化的文本文件,以便每行有3个数字,用空格分隔。 我需要我的Perl代码来横向读取此文件并忽略空格。
目前正在向下阅读并忽略所有其他内容:
2 5 10
3 30 60
我的代码只能读取2和3。
use strict;
open (FILE, shift);
my @contents = <FILE>;
my $first = splice @contents, 0;
my $second = splice @contents, 1;
my $third = splice @contents, 2;
my $total = $first + $second + $third;
print "$total\n";
答案 0 :(得分:4)
您未指定所需内容。我猜你想要从每一行中获取值,一次一行。 (2,5和10,然后是3,30和60)
我不确定你知道splice
做了什么。
my $first = splice @contents, 0;
my $second = splice @contents, 1;
my $third = splice @contents, 2;
应该是
my $first = splice @fields, 0, 1;
my $second = splice @fields, 0, 1;
my $third = splice @fields, 0, 1;
您没有指定您只想删除一个项目,并且您没有考虑从早期从阵列中删除时发生的索引转换。
可能没有理由从数组中删除元素,所以这是愚蠢的代码。你可以简单地使用
my $first = $fields[0];
my $second = $fields[1];
my $third = $fields[2];
甚至
my ($first, $second, $third) = @fields;
那么如何从一条线上获取字段? split
my @fields = split(' ', $line);
一起,
use strict;
use warnings;
use feature qw( say );
open(my $FILE, '<', shift) or die $!;
while (<$FILE>) {
my @fields = split(' ', $_);
my ($first, $second, $third) = @fields;
my $total = $first + $second + $third;
say $total;
}
但这可以简化。
use strict;
use warnings;
use feature qw( say );
use List::Util qw( sum );
while (<>) {
say sum split;
}
参考文献:
答案 1 :(得分:1)
执行此操作时:
my @contents = <FILE>;
您正在将文件的全部内容读入数组。你的数组看起来像:
("2 5 10","3 30 60")
那时候,你正试图用字符串做数学......而没有得到你期望的结果。
您需要读取循环中的每一行并分析各个数字。
while (my $line = <FILE>)
{
chomp($line);
my ($first, $second, $third) = split(' ', $line);
...
}
答案 2 :(得分:1)
首先,您可能希望一次读取一行文件(尽管只有三行并不重要):
while (defined my $line = <FILE>) {
...
}
接下来,您需要找到每行中的第一个数字。最简单的方法可能是split
my @columns = split(/\h+/, $line);
然后,您希望从每列中获取第一个值,并将其添加到运行总计中:
$total += $columns[0];
或者从您的编辑中,也许您想要汇总所有列,在这种情况下它们是$columns[0]
到$columns[2]
(Perl从0开始计算)。所以你可以写:
$total += $columns[0] + $columns[1] + $columns[2]
但是使用模块会更容易:
use List::Util qw(sum);
$total += sum(@columns);
我不清楚你想用第一个以外的线做什么。我假设您想要文件中所有数字的总和。
有一种非常紧凑的方法可以“汇总文件中的所有数字”,如下所示:
use List::Util qw(sum);
$total = sum map { split } <FILE>;
但它依赖于理解一些更高级的Perl功能。
答案 3 :(得分:0)
文件按顺序存储。您的样本将存储在磁盘上2 5 10\n3 30 60
,这是读取文件的顺序。您将需要读取每一行,将每行解析为列,然后从每行读取第一列。