2012-12-06 41 views
2

我有它的佔位符,我想替換一個路徑:Perl的條件替代

# an example path with a placeholder 
my $path = '%myproject%Web/ui/images/'; 

# mapping of all placeholders 
my %placeholders = (
    myproject => 'myproject/installation/all' 
); 

# substituting all placeholders in the path 
$path =~ s!%(.*?)%!/$placeholders{$1}/!g; 

# works fine -> 'myproject/installation/all/Web/ui/images/' 
print $path; 

此代碼工作正常,但有一個問題:我有指定filesnames和不同的佔位符的一個長長的清單(因此散列)。現在爲了更健壯,我想拋出一個錯誤,如果在%placeholders映射中不存在的路徑中指定了佔位符。

有沒有辦法做到這一點?

回答

7

現在更多的穩健性,我想拋出一個錯誤的緣故,如果在指定的路徑的佔位符,其不會在%佔位映射存在

這可以非常做容易使用/e

$path =~ s{%([^%]+)%}{ 
    exists($path{$1}) 
     ? '/'.$path{$1}.'/' 
     : die "Placeholder $1 does not exist" 
}ge; 

注:我認爲這是很好用[^%]+更換.*?以防止不正確的匹配。

+0

在這種使用情況下,definedness一個簡單的測試可能就足夠了,因爲它是包含字符串現有的,但未定義值的錯誤。這會將替換代碼簡化爲'$ path {$ 1} // die ...' – amon

+0

@amon它的測試用於定義,不存在。但是,是的,我認爲它是可能的。但是他沒有說他有什麼Perl版本,因爲'//'是相對較新的操作符。 – PSIAlt

+0

@amon謝謝你的優秀和快速的答覆。 amons版本適用於我的perl 5.12。但有一個問題:我有'/ $ path {$ 1} /'< - 這些封閉的'/'也需要在那裏。 – Christoph

1

使用given允許這樣做,但是如果語句修飾符形式爲given可用,它會比它可能長得多。

use v5.10;; 
use warnings; 

my $path = '%myproject%Web/ui/images/'; 

my %placeholders = (
    myproject => 'myproject/installation/all' 
); 

$path =~ s!%(\w+)%!given ($placeholders{$1} // die qq(Invalid placeholder "$1")) { "/$_/" }!ge; 

print $path;