-1

我知道这是一个相当简单的问题,但我无法弄清楚如何以我想要的方式将所有值存储在我的数组中。这是 .txt 文件的一小部分:

0 A R N D
A 2 -2 0 0
R -2 6 0 -1
N 0 0 2 2
D 0 -1 2 4

每个值由两个空格分隔 - 如果下一个值为正 - 或一个空格和一个“-” - 如果下一个值为负

这是代码:

use strict;
use warnings;

open my $infile, '<', 'PAM250.txt' or die $!;
my $line;
my @array;

while($line = <$infile>) 
{
    $line =~ /^$/ and die "Blank line detected at $.\n";
    $line =~ /^#/ and next; #skips the commented lines at the beginning
    @array = $line;
    print "@array"; #Prints the array after each line is read
};

print "\n\n@array"; #only prints the last line of the array ?

我知道 @array 只保存传递给它的最后一行。有没有办法让@array 保存所有行?

4

4 回答 4

1

如果文件比您机器的可用内存小,那么您可以简单地使用以下方法将文件内容读入数组

open my $infile, '<', 'PAM250.txt' or die $!;
my @array = <$infile>;
close $infile;

如果您要读取一个非常大的文件,那么最好像您一样逐行读取它,但使用PUSH将每一行添加到数组末尾。

push(@array,$line);

我建议您还阅读有关perl 中更多数组操作函数的信息

于 2019-02-23T17:02:13.200 回答
1

您正在寻找push

push @array, $line;

毫无疑问,您首先要在此之前chomp剪断任何换行符。

于 2019-02-23T16:40:18.433 回答
0

你不清楚你想要实现什么。

每一行都是数组的元素吗?

你的数组中的每一行都是一个数组吗?你的“单词”是这个数组的元素吗?

无论如何。

以下是您可以同时实现这两个目标的方法:

use strict;
use warnings;
use Data::Dumper;

# Read all lines into your array, after removing the \n
my @array= map { chomp; $_ } <>;

# show it
print Dumper \@array;

# Make each line an array so that you have an array of arrays
$_= [ split ] foreach @array;

# show it
print Dumper \@array;
于 2019-02-26T14:15:37.470 回答
-1
try this...


sub room
{
   my $result = "";
   open(FILE, <$_[0]);
   while (<FILE>) { $return .= $_; }
   close(FILE);
   return $result;
}

所以你有一个基本的功能,没有伟大的词。之前的建议包含在大文件上失败的风险。最快的安全方法就是这样。随便叫吧……

我的@array = &room('/etc/passwd');

打印室('/etc/passwd');

你可以缩短,重命名为你的convinience相信。

到附近开玩笑的鸭子:通过这种方式,推动被简单取代。文本文件包含换行符。传统的 push 删除了换行符并仅向上推行。数组的构造是一个带有换行符的简单字符串。现在包含步长...

于 2019-02-24T03:09:20.300 回答