连接字符串

时间:2013-03-27 13:18:58

标签: string algorithm perl

我的算法设计存在很大问题,因为我使用的是大文本文件。 我有一个包含单词序列的文本文件。 例如

  1. 我的朋友
  2. 你好朋友
  3. 世界
  4. 并且第二个文件是包含句子的大(千兆字节)。 该程序的目标是通过单词(第一个文件)逐字逐句,并在第二个文件中查找连接符号“+”

    例如,

    你好,我的世界朋友”作为输入“成为 “你好+我的朋友 +世界

    请问好吗? 我想用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);
    

1 个答案:

答案 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 $_;
}