2014-04-21 40 views
0

只想知道是否/如何做到這一點的工作:Perl的正則表達式 - 商店參考正則表達式捕獲在一個變量

my $capture = qr/perl pattern(is.*)/; 
my $string = "perl pattern is complicated"; 
my $print_it = "Printing test: $1\n"; 

if($string =~ m/$capture/){ 
print $print_it; 
} 

我試着用不同的方式報價$ print_it(QW,QR「」「」 ),但在創建模式字符串時未初始化,並且在運行時未設置。

其他方法,我敢肯定,但這會很方便。編輯: 這是我想要完成的。我希望用戶提供一個參數來定義如何格式化輸入字符串。比如,--format 1 輸入字符串: 「user = username Resources_used_cput = 20:00:01 Resources_used_walltime = 10:00」 假設我只想根據命令行中的一個標誌來拉動walltime或cputime和username。我正在考慮定義一組格式化選項,如0表示用戶名,1表示用戶名和cputime,2表示用戶名和walltime。有了3,使用暴力很容易,只需定義一些if/then語句或匹配的案例。隨着這個規模的擴大,我更願意將一個數組放在一個大的if/case列表中。

$formats = (
qr/user=(\S+)/, 
qr/user=(\S+).*Resources_used_cput=(\d+):(\d+):(\d+)/, 
qr/user=(\S+).*Resources_used_walltime=(\d+):(\d+)/); 
# These are wrong for reasons stated in answers: 
$responses = (
"username is $1", 
"user $1 used $4 seconds, $3 minutes and $2 hours of cputime" 
"user $1 used $2 hours $3 minutes of walltime"); 

VS

if(m/user=(\S+).*Resources_used_cput=(\d+):(\d+):(\d+).*Resources_used_walltime=(\d+):(\d+)/){ 
$user=$1; 
$wall="$5:$6"; 
$cpu="$2:$3:$4"; 
} 
if($format == 0){ 
print "username is $user" 
} 
elsif.... 

我猜有一個更好的辦法?

+0

'$ 1'只是一個變量,當您進行賦值時,變量將在字符串中擴展。 – Barmar

+0

我不認爲有什麼辦法可以創建一個只在打印時擴展其變量的字符串。你爲什麼不寫一個你想要的功能呢? – Barmar

回答

1

$print_it轉換爲代碼參考。

my $print_it = sub { "Printing test: $1\n" }; 
... 
print $print_it->(); # or print &$print_it; 
+0

我可以創建一個子程序引用數組,以適合我想要做的很好的事情。謝謝! – user1885897

1

你根本不需要引用$ capture;見下文。

my $capture = qr/perl pattern(is.*)/; 
my $string = "perl pattern is complicated"; 
my $print_it = "Printing test: $1\n"; 

if($string =~ $capture){ 
    print $print_it; 
    print "Printing test: $1\n"; 
} 

但問題是,$ 1是字符串裏面,當你打印評估第3行,而不是以後。在上面的代碼中,第二個「打印測試」將起作用,但第一個不會。

Printing test: 
Printing test: is complicated 
+0

這對我來說很有意義,並證實了我懷疑的事情正在發生。不過,我很樂意提出一個建議。 – user1885897