我有一个带有占位符的路径名,我想替换它:
# 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;
此代码工作正常,但有一个问题:我有一长串文件名和指定的不同占位符(因此哈希)。现在为了更强大,如果路径中指定的占位符在%placeholders
映射中不存在,我想抛出错误。
有没有办法实现这个目标?
答案 0 :(得分:7)
现在为了更强大,如果路径中指定的占位符在%占位符映射中不存在,我想抛出错误
使用/e
:
$path =~ s{%([^%]+)%}{
exists($path{$1})
? '/'.$path{$1}.'/'
: die "Placeholder $1 does not exist"
}ge;
注意:我认为将.*?
替换为[^%]+
可以防止错误匹配。
答案 1 :(得分: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;