Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 从左到右读取文件_Perl - Fatal编程技术网

Perl 从左到右读取文件

Perl 从左到右读取文件,perl,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

我有一个格式化的文本文件,每行有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";
使用严格;
打开(文件、班次);
我的@contents=;
my$first=拼接@内容,0;
my$second=拼接@内容,1;
my$third=拼接@目录,2;
my$total=$first+$second+$third;
打印“$total\n”;

文件按顺序存储。您的样本将存储在磁盘上,这是文件的读取顺序。您必须读入每一行,将每一行解析为列,然后从每一行读取第一列。

文件按顺序存储。您的样本将存储在磁盘上,这是文件的读取顺序。您必须读入每一行,将每一行解析为列,然后从每一行中读取第一列。

执行此操作时:

my @contents = <FILE>;
在这一点上,你试图用字符串做数学运算。。。没有得到你想要的

您需要读取循环中的每一行并解析出各个数字

while (my $line = <FILE>)
{
    chomp($line);
    my ($first, $second, $third) = split(' ', $line);
    ...
}
while(我的$line=)
{
chomp($line);
我的($first,$second,$third)=分割('',$line);
...
}
执行此操作时:

my @contents = <FILE>;
在这一点上,你试图用字符串做数学运算。。。没有得到你想要的

您需要读取循环中的每一行并解析出各个数字

while (my $line = <FILE>)
{
    chomp($line);
    my ($first, $second, $third) = split(' ', $line);
    ...
}
while(我的$line=)
{
chomp($line);
我的($first,$second,$third)=分割('',$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>;
use List::Util qw(sum);
$total=和映射{split};

但是,它依赖于理解一些更高级的Perl特性。

首先,您可能希望一次读取一行文件(尽管只有三行并不重要):

然后,您需要从每列中获取第一个值,并将其添加到您的跑步总数中:

$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>;
use List::Util qw(sum);
$total=和映射{split};

但是它依赖于理解一些更高级的Perl特性。

您没有指定想要什么。我猜您希望从每一行中获取值,一次一行。(2、5和10,然后是3、30和60)

我不确定你是否知道该怎么做

应该是

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;
那么如何从一条直线上得到场呢

总的来看,

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;
}
使用严格;
使用警告;
使用特征qw(例如);

打开(我的$FILE,“您没有指定所需内容。我猜您希望从每一行中获取值,一次一行。(2、5和10,然后是3、30和60)

我不确定你是否知道该怎么做

应该是

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;
那么如何从一条直线上得到场呢

总的来看,

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;
}
使用严格;
使用警告;
使用特征qw(例如);

打开(我的$FILE,'Post-come代码,这样我们可以看到您当前正在尝试的内容。我向您保证,perl正在读取文件的每一行,而不仅仅是第一个字符。如果您发布代码,我们可以告诉您错误所在。我已经添加了代码…我希望perl可以读取为2 5 10等,而不是2 3 Post-come代码,这样我们可以看到您的错误所在目前正在尝试我向您保证perl正在读取文件的每一行,而不仅仅是第一个字符。如果您发布代码,我们可以告诉您您做错了什么。我已经添加了代码…我希望perl读取为2 5 10等,而不是2 3
split“”
splits,而不仅仅是单个空格。它更健壮。@ikega米,是的,我在那个问题上反复讨论,但不想查找它……我的perl-foo开始降级,因为我已经有一段时间没做任何事情了。
split'
splits在空格上,而不仅仅是单个空格。它更健壮。@ikegami,是的,我反复讨论,但不想查找它……我的perl-foo是starti因为我已经有一段时间没有做任何事情了,所以我想降级。基本上,我希望能做到的是,完全按照你说的阅读内容,然后将每行中的内容加在一起。我感谢你的帮助help@Daveid弗雷德,是的,我注意到你提到在我开始写我的答案后。这篇文章非常详细地回答了如何做。基本上,我希望的是