2011-05-15 82 views
1

Howdieperl從文件中讀取正則表達式

我已經將我使用最多的所有正則表達式歸類爲庫文件。舉一個虛擬的例子,我有一個叫做/mysdk/library/regex/email/match與文件的內容:

^[a-z]@[a-z]\.com$ 

(我知道這是不好的正則表達式,但是這對於例如:))。而且我有很多與常用的正則表達式的文件夾:

/library 
    /regex 
    /email 
    /url 
    /social_security 
    ... 

現在我正在做一個Perl腳本,會告訴我,如果給定的字符串從我的圖書館給定的正則表達式匹配。例如,

perl my-script.pl email [email protected] 

而腳本應該在false上打印0,在true上打印1。但它不工作:(這是我的腳本:

if($ARGV[1]) 
{ 
    if(open(REGEX_CONSTANT,"/mysdk/library/regex/$ARGV[0]/match")) 

    { 
     $regex_constant=<REGEX_CONSTANT>; 
     close(REGEX_CONSTANT); 

     if($ARGV[1] =~ m/$regex_constant/) { print 1; exit } 
    } 

    print 0 
} 

else 

{ 
    print 0 
} 

我也試過

if($ARGV[1] =~ m/($regex_constant)/) { print 1; exit } 

即使字符串應該匹配,它打印0。我知道它找到的文件和成功讀取它的內容,因爲我已經調試過了。我做錯了什麼?

回答

2

你可能會在這些行上換行符,或者可能是頭文件。嘗試在讀取的字符串上運行chomp。知道這些文件是什麼樣的。

+0

謝謝你,這是關係到尾隨的​​新行! – francoisrv 2011-05-15 14:47:51

1

你有沒有考慮看Regexp::Common

這也許不能直接解決您的問題,但可以幫助你進行分類,其已經包括了一些很常見的正則表達式的可能對你有用。

+0

有趣!目前,我寧願擁有庫文件,因爲我用Bash和PHP(現在是Perl和Python)編碼,所以它更具可移植性。但在我學習Perl的過程中,它確實有助於:) – francoisrv 2011-05-15 14:49:45

1

而不是將正則表達式中的文件,你可能會考慮把它們的模塊中:

# In FavoriteRegex.pm. 
package FavoriteRegex; 

use strict; 
use warnings; 

use parent qw(Exporter); 
our @EXPORT = qw(); 
our @EXPORT_OK = qw(%FAVS); 

our %FAVS = (
    foo  => qr/foo/, 
    integer => qr/\A\d+\Z/, 
); 

1; 

腳本需要那些正則表達式變得更加簡單:

# In some_script.pl. 
use strict; 
use warnings; 

use FavoriteRegex qw(%FAVS); 

say 'foo'  if 'blah foo blah' =~ $FAVS{foo}; 
say 'integer' if '1234'   =~ $FAVS{integer}; 
say 'integer?!?' if '1234.0'  =~ $FAVS{integer}; 

即使你的項目要求正則表達式存在於它們自己的非Perl文件中,讀取這些文件的工作應該在模塊中完成(本例中爲FavoriteRegex.pm),而不是腳本。