从左到右阅读文件

时间:2012-01-31 22:47:11

标签: perl

我有一个格式化的文本文件,以便每行有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";

4 个答案:

答案 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,这是读取文件的顺序。您将需要读取每一行,将每行解析为列,然后从每行读取第一列。