我的算法设计存在很大问题,因为我使用的是大文本文件。 我有一个包含单词序列的文本文件。 例如
并且第二个文件是包含句子的大(千兆字节)。 该程序的目标是通过单词(第一个文件)逐字逐句,并在第二个文件中查找连接符号“+”
例如,“你好,我的世界朋友”作为输入“成为 “你好+我的朋友 +世界”
请问好吗? 我想用Perl编写它,用文本表现
我在Perl中完成了这个脚本,但它太慢了,因为它读取文件很多时候.. :( 这是Perl程序的一个例子,它可以工作,但它太慢了
use strict;
use warnings;
use utf8;
use feature qw(:5.10);
my ($in, $dico) = @ARGV;
die "Bad infile $in" if !-r $in;
die "Bad dicofile $dico" if !-r $dico;
# load dico
my @dico;
open(FICHIERNOUVELLES, ">resultat7.txt");
open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n";
# For all lines in the Dico
foreach my $line (<$DICO>) {
chomp($line);
# extract words
if (my @word = split /\s+/, $line) {
my $re = q{(^\s*|\s+)(}.(join q(\s+), map quotemeta, @word).q{)(\s+|\s*$)};
push @dico, qr/$re/;
}
}
open my $IN, "<", $in or die "Can't open $in for reading: $!\n";
my @word;
foreach my $line (<$IN>) {
foreach my $dico (@dico) {
while (my (undef, $sequence) = $line =~ /$dico/) {
$sequence =~ s/\s+/+/g;
$line =~ s/$dico/$1$sequence$3/;
}
}
print FICHIERNOUVELLES "$line";
}
close(FICHIERNOUVELLES);
答案 0 :(得分:2)
多次不读取第二个文件的解决方案是首先从file1读取单词集,然后存储在数据结构中。
use File::Slurp;
my @lines = read_file($filename1);
my %replacements = map { my $c = $_; $c =~ s/ / + /g; ( $_ => $c ) } @lines;
open (my $file2, "<", $filename2) or die "$!";
while (<$file2>) {
chomp;
foreach my $replacement (keys %replacements) {
s/$replacement/$replacements{$replacement}/g;
}
print $_;
}