Perl条件替换

时间:2012-12-06 11:02:44

标签: regex perl substitution

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

# 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映射中不存在,我想抛出错误。

有没有办法实现这个目标?

2 个答案:

答案 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;