2

我有一个带有占位符的路径名,我想替换它:

# 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现在,为了更加稳健,如果路径中指定的占位符在映射中不存在,我想抛出一个错误。

有没有办法做到这一点?

4

2 回答 2

7

现在为了更加健壮,如果路径中指定的占位符在 %placeholders 映射中不存在,我想抛出一个错误

这可以很容易地使用/e

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

注意:我认为最好替换.*?[^%]+以防止不正确的匹配。

于 2012-12-06T11:08:04.890 回答
1

Usinggiven允许这样做,但它比如果声明修饰符形式 ofgiven可用的话要长得多。

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;
于 2012-12-06T13:12:48.703 回答