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; 

このコードは正常に動作しますが、問題が 1 つあります。指定されたファイル名とさまざまなプレースホルダーの長いリスト (したがってハッシュ) があります。%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

を使用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;
于 2012-12-06T13:12:48.703 に答える