2012-12-06 40 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;