我有一个大的(300 kB)文本文件,其中包含由空格分隔的单词。现在我想打开这个文件并逐个处理它中的每个单词。
问题是perl一次一行地读取文件(即)整个文件,这给我带来了奇怪的结果。我知道正常的方法是做一些像
这样的事情open($inFile, 'tagged.txt') or die $!;
$_ = <$inFile>;
@splitted = split(' ',$_);
print $#splitted;
但这会给我一个错误的字数(太大的数组?)。
是否可以逐字逐字地阅读文本文件?
答案 0 :(得分:5)
不要一下子读取它,而是尝试逐行的方法,这对您的机器的内存使用也更容易(尽管300 KB对于现代计算机来说不是太大)。 / p>
use strict;
use warnings;
my @words;
open (my $inFile, '<', 'tagged.txt') or die $!;
while (<$inFile>) {
chomp;
@words = split(' ');
foreach my $word (@words) { # process }
}
close ($inFile);
答案 1 :(得分:4)
要一次读取一个单词的文件,请将输入记录分隔符($/
)更改为空格:
local $/ = ' ';
示例:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
{
local $/ = ' ';
while (<DATA>) {
say;
}
}
__DATA__
one two three four five
输出:
one
two
three
four
five
答案 2 :(得分:2)
目前还不清楚你输入的文件是什么样的,但你暗示它只包含一行由许多“单词”组成的单行。
300KB远离“大文本文件”。你应该完整地阅读它并逐一从那里拉出来。该计划演示
use strict;
use warnings;
my $data = do {
open my $fh, '<', 'data.txt' or die $!;
local $/;
<$fh>;
};
my $count = 0;
while ($data =~ /(\S+)/g ) {
my $word = $1;
++$count;
printf "%2d: %s\n", $count, $word;
}
<强>输出强>
1: alpha
2: beta
3: gamma
4: delta
5: epsilon
如果没有更多解释“错误字数”的内容可能很难提供帮助,但可以肯定问题不是因为数组的大小:如果有那是一个问题然后Perl会提出异常而死。
但是如果你将结果与文字处理器的统计数据进行比较,那么可能是因为“word”的定义不同。例如,文字处理器可以将带连字符的单词视为两个单词。
答案 3 :(得分:1)
300K似乎不大,所以你可以尝试:
my $text=`cat t.txt` or die $!;
my @words = split /\s+/, $text;
foreach my $word (@words) { # process }
或略微修改的squiguy解决方案
use strict;
use warnings;
my @words;
open (my $inFile, '<', 'tagged.txt') or die $!;
while (<$inFile>) {
push(@words,split /\s+/);
}
close ($inFile);
foreach my $word (@words) { # process }