2013-10-19 35 views
3

我想聲明一個常量作爲一個襯墊這樣的:的毗連正則表達式與常量聲明字符串作爲oneliner

use constant HOME_SCRIPT => "/home/george/". $0 =~ /(.*)\.pl/;
的問題是,這將返回:/home/george/1。即它連接正則表達式匹配的數量。
我想:
use constant HOME_SCRIPT => ("/home/george/"). $0 =~ /(.*)\.pl/;
use constant HOME_SCRIPT => "/home/george/". ($0 =~ /(.*)\.pl/);
但同樣的結果。
是否有可能爲此創建一個oneliner?

回答

4
use constant HOME_SCRIPT => "/home/george/". ($0 =~ /(.*)\.pl/)[0]; 

use constant HOME_SCRIPT => join "", "/home/george/", $0 =~ /(.*)\.pl/; 
+0

+1這個工程。你能解釋第一個是如何工作的嗎? – Cratylus

+0

@Cratylus它需要列表中的第一個元素,「(list)[0]」,所以正則表達式停留在列表上下文中,而不是強制標量上下文的。 –

0

如果你正在運行的Perl 5版本14或更高版本,可以使用通過/r修改非破壞性的替代。像這樣

use constant HOME_SCRIPT => ("/home/george/$0") =~ s/\.pl\z//r; 

或者,如果你被迫較早使用的東西,或者只會喜歡不同的方法,你可以寫

use constant HOME_SCRIPT => '/home/george/' . ($0 =~ /(.*)\./, $1);