2013-11-09 125 views
1

我有一個包含要從文件的每一行中刪除的單詞的數組。我使用的代碼大致如下:Perl - 正則表達式不被替換

my $INFILE; 
my $OUTFILE; 
my $STOPLIST; 
open($INFILE, '<', $ARGV[0]); 
open($STOPLIST, '<', "stop.txt"); 
open($OUTFILE, '>', $ARGV[1]); 

my @stoplist = <$STOPLIST>; 

my $line; 
my $stopword; 
while (<$INFILE>) { 
    $line = $_; 
    $line =~ s/\[[0-9]*\] //g; 
    $line =~ s/i\/.*\/; //g; 
    foreach (@stoplist) { 
     $stopword = $_; 
     $line =~ s/${stopword}//g; 
    } 
    print $OUTFILE lc($line); 
} 

然而,在非索引字表的話,仍然會在輸出文件中的文本,這將表明$line =~ s/${stopword}//g;線沒有做它的工作如我所料。

我該如何做這項工作(即確保出現在輸入文本中的停止列表中的所有單詞都被輸出中的0個字符替換)?

+1

您必須始終* *'使用strict'和'使用warnings'。如果你不這樣做,那麼你也不用費神地宣佈你的變量。 – Borodin

+1

's/i \ /.* \ /; // g'會將'i /'的第一個*出現的文本移到'/的最後一個*出現處; '在字符串中,所以如果不止一次出現'i /.../;',那麼它們之間的所有內容都將被刪除。如果有*從不多於一個這樣的字符串,那麼你不需要'/ g'修飾符。 – Borodin

回答

2

你需要使用chomp,去掉你停止列表中的新行:

my @stoplist = <$STOPLIST>; 
chomp @stoplist; 
+1

謝謝!現在可以工作。 – Froskoy