Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl条件替换_Regex_Perl_Substitution - Fatal编程技术网

Regex Perl条件替换

Regex Perl条件替换,regex,perl,substitution,Regex,Perl,Substitution,我有一个带有占位符的路径名,我想替换它: #带有占位符的示例路径 my$path='%myproject%Web/ui/images/'; #所有占位符的映射 我的%占位符=( myproject=>“myproject/installation/all” ); #替换路径中的所有占位符 $path=~s!%(.*?)%!/$占位符{$1}/!G #工作正常->myproject/installation/all/Web/ui/images/' 打印$path; 这段代码工作正常,但有一个问题

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

#带有占位符的示例路径
my$path='%myproject%Web/ui/images/';
#所有占位符的映射
我的%占位符=(
myproject=>“myproject/installation/all”
);
#替换路径中的所有占位符
$path=~s!%(.*?)%!/$占位符{$1}/!G
#工作正常->myproject/installation/all/Web/ui/images/'
打印$path;
这段代码工作正常,但有一个问题:我有一长串文件名和指定的不同占位符(因此是散列)。现在,为了更加健壮,如果路径中指定了一个占位符,而该占位符在
%placeholders
映射中不存在,我想抛出一个错误

有没有办法做到这一点

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

使用
/e
可以非常轻松地完成此操作:

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

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

使用
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;

在这个用例中,一个简单的定义测试就足够了,因为在字符串中包含一个现有但未定义的值是一个错误。这将把替换代码简化为
$path{$1}//die…
@amon,用于测试已定义的、不存在的代码。但是,是的,我认为这是可能的。但是他没有说他有什么Perl版本,因为
/
是一个相对较新的操作符。@amon感谢你们两位出色且快速的回复。amons版本对于我的perl 5.12来说工作得很好。但是有一个问题:我有
/$path{$1}/
@Christoph修复了answ,对于
/
运算符,它似乎不可能,对于三元运算符,这是一个简单的方法,但是对于定义运算符,它不起作用?我喜欢这个,因为它很紧凑。