2010-07-19 71 views
3

我有一堆匹配,我需要做的,他們都使用相同的代碼,除了要讀取的文件的名稱和正則表達式本身。因此,我想將匹配轉換爲一個只接受文件名和正則表達式作爲字符串的過程。但是,當我使用該變量嘗試匹配時,特殊捕獲變量停止設置。以Perl中的變量正則表達式捕獲組

$line =~ /(\d+)\s(\d+)\s/; 

的代碼的組$ 1和$ 2正確,但下面使他們不確定:

$regexp = "/(\d+)\s(\d+)\s/"; 
$line =~ /$regexp/; 

任何想法如何,我可以解決這個問題?

感謝, 賈裏德

回答

1

引用您正則表達式的字符串全光照QR:

my $regex = qr/(\d+)\s(\d+)\s/; 
my $file =q!/path/to/file!; 
foo($file, $regex); 

然後在子:

sub foo { 
my $file = shift; 
my $regex = shift; 

open my $fh, '<', $file or die "can't open '$file' for reading: $!"; 
while (my $line=<$fh>) { 
    if ($line =~ $regex) { 
     # do stuff 
    } 
} 
7

使用qr而不是報價:

$regexp = qr/(\d+)\s(\d+)\s/; 
$line =~ /$regexp/; 
4

報價使用Perl的正則表達式報價般的操作qr

$regexp = qr/(\d+)\s(\d+)\s/; 

該運營商的報價(也可能是您的字符串編譯)其STRING作爲正則表達式。

更多信息參閱perldoc頁: http://perldoc.perl.org/functions/qr.html