2013-02-05 73 views
0

我有一個Perl腳本無法正常工作的問題。該腳本需要2文件上的說法:我的Perl的正則表達式匹配代碼無法正常工作

首先是詞彙:

a 
à 
abaissa 
abaissable 
abaissables 
abaissai 
abaissaient 
abaissais 
abaissait 
abaissâmes 

第二是語料庫:

ASEAN New Markets (renommé « Equity ASEAN » à partir du 24 juin 2011), Gems World, Emerging Internai Demand (renommé « Equity Emerging Internai\ 
Demand » à partir du 24 juin 2011), Emerging Markets (intégré au Compartiment « Emerging World » le 24 juin 2011) et Emerging World (renommé «\ 
Equity Emerging World » à partir du 24 juin 2011). 
Les Actions de catégorie « B » ne sont pas soumises à des Frais sur vente réglés d'avance (c'est-à-dire des Frais sur vente qui réduisent le mo\ 
ntant de la souscription au Fonds d'un investisseur) mais sont soumises à des FVDE prélevés sur les rachat d'Actions de catégorie « B » effectu\ 
és dans les quatre (4) années suivant la date d'achat (qui, pour les Actions de catégorie « B » acquises le 29 février lors de n'importe quelle\ 
année, seront réputées avoir été achetées le jour précédent) comme suit : 
Les Actions de catégorie « B » peuvent être échangées à la valeur liquidative par Action des Actions de catégorie « B » du Portefeuille sans qu\ 
'aucun Frais de vente ne soit prélevé à ce moment-là. 
« Jour ouvrable » : 
Les « transactions couvertes » comprennent les prêts ou extensions de crédit, les achats d'actifs et certains autres types de transactions (y c\ 
ompris les transactions sur produits dérivés et les garanties) qui entraîneraient pour les entités bancaires ou leurs sociétés affiliées un ris\ 
que de crédit par rapport à des fonds gérés par leurs sociétés affiliées. 
«CSSF» désigne la Commission de Surveillance du Secteur Financier. 
« Jour de négociation » : 
«Directive 78/660/CEE» (Directive 78/660/EEC) désigne la directive 78/660/CEE du 25 juillet 1978 fondée sur l’Article 54 paragraphe 3 g) du Tra\ 
ité concernant les comptes annuels de certaines formes de sociétés, telle que modifiée. 
les « démarcheurs » ou les « commissions d'indication de clients » pour avoir orienté les investisseurs vers les Portefeuilles, Comptes client/\ 
GS et autres produits ; 
« Global Diversified Equity » - Ce Compartiment vise l'appréciation du capital sur le moyen et long terme en investissant principalement dans u\ 
n portefeuille diversifié d'actions et d'instruments apparentés à des actions émis par des sociétés du monde entier. 

和腳本:

use strict; 
use utf8; 
open(LEX, "<$ARGV[0]") or die "Usage: ./script PATH_TO_LEXIQUE PATH_TO_CORPUS\nAn error occured, open: $!"; 

my $tmp = ""; 


while (<LEX>) 
{ 
    $tmp = $_; 

    open(CORPUS, "<$ARGV[1]") or die "Usage: ./script PATH_TO_LEXIQUE PATH_TO_CORPUS\nAn error occured, open: $!"; 

    S: while (<CORPUS>) 
    { 
     if ($_ =~ m/$tmp/) 
     { 
      print "Matched !"; 
    } 
     last S if $_ =~ m/$tmp/; 
    } 
    if ($_ =~ m/$tmp/) 
    { 

    } 
    else 
    { 
     print $tmp; 
    } 
    close(CORPUS); 
} 
close(LEX); 

但正則表達式不匹配,儘管他應該這樣做,因爲兩個文檔中都存在字符「à」。

我試過幾個測試,看起來長度($ tmp)與$ tmp = a(詞彙的第一行)等於4?! 任何人都可以幫助我嗎?

+2

請重命名問題更多相關的東西 – user1126070

回答

4

我認爲問題在於你沒有閱讀正確的編碼文件。

使用utf8不是這個。

How do I read UTF-8 with diamond operator (<>)?

使用binmode,UTF8你打開文件後。

binmode LEX, ':utf8'; 
binmode CORPUS, ':utf8'; 

使用data :: dumper打印出實際數據來檢查它。

use Data :: Dumper; ...

S: while (<CORPUS>) 
{ 

    if ($_ =~ m/$tmp/){ 
     print "Matched !"; 
    } 
    die Dumper($tmp,$_); 
    last S if $_ =~ m/$tmp/; 
} 
1

前$ TMP = $ _線,你需要一個格格,除去EOL字符

+0

tmp = $ _和我打印$ tmp,它是空的 – user1895140

3

行以換行符結束。您正在搜索兩個字符「a \ n」而不是「a」。使用chomp刪除尾隨換行符。

固定的,與許多其他問題和代碼差沿:

use strict; 
use warnings; 
use utf8; 
use open ':std', ':utf8'; 

@ARGV == 2 
    or die("Usage: ./script PATH_TO_LEXIQUE PATH_TO_CORPUS\n"); 

open(my $LEX, "<", $ARGV[0]) 
    or die("Can't open $ARGV[0]: $!\n"); 

WORD: while (my $word = <$LEX>) { 
    chomp($word); 
    my $pat = quotemeta($word); 

    open(my $CORPUS, "<", $ARGV[1]) 
     or die("Can't open $ARGV[1]: $!\n"); 

    while (<$CORPUS>) { 
     if (/$pat/) { 
      print "Matched $word!\n"; 
      next WORD; 
     } 
    } 

    print "Didn't match $word\n"; 
} 

要調試,

  1. 全部刪除,但在每個文件的第一行。

  2. 添加以下代碼:

    use Data::Dumper qw(Dumper); 
    
    sub dump_str { 
        local $Data::Dumper::Useqq = 1; 
        local $Data::Dumper::Terse = 1; 
        local $Data::Dumper::Indent = 0; 
        return Dumper($_[0]); 
    } 
    
  3. 添加以下之前if (/$pat/):如果我$之前使用格格

    printf("\$_=%s; \$pat=%s\n", dump_str($_), dump_str($pat)); 
    
+0

readline()未打開的文件句柄LEX在script2.perl第12行。 – user1895140

+0

Shoul d是'<$LEX>',而不是''。我從全局變量切換到詞法變量。 – ikegami

+0

謝謝。你的腳本似乎正常工作,但他們不匹配... – user1895140