Вы можете заменить переменную. Левая часть s///
может быть значением хеш-функции.
my $str = '$JVM/$JAVA8/Contents/Home';
my %con = (
'\$JVM' => '/Library/Java/JavaVirtualMachines',
'\$JAVA8' => 'jdk1.8.0_192.jdk'
);
$str =~ s{
( # capture group for $1
\\ # the backslash in your '\$JVM' hash key
\$ # a literal dollar sign
[A-Z0-9_]+ # variable name
)
}{$con{$1}}gx;
print $str;
Обратите внимание, что в вашем $str
вы хотите использовать одинарные кавычки ''
, которые не выполняют интерполяцию , или вы получите ошибку, так как у вас нет переменной $JVM
.
В то же время вам нужно обратить внимание на ваши хэш-ключи. Если они действительно '\$JVM'
и такие, это означает, что в них есть буквальная обратная косая черта \
и буквальный доллар $
. Поэтому в шаблоне нам нужно три обратных слеша \\\
. Два, чтобы получить буквальный (как обратный слеш избегает вещей с особым значением в регулярных выражениях), и один, чтобы избежать доллара.
Если ваши ключи не имеют обратной косой черты, шаблон меняется.
my %con = (
'$JVM' => '/Library/Java/JavaVirtualMachines',
'$JAVA8' => 'jdk1.8.0_192.jdk'
);
$str =~ s{(\$[A-Z0-9_]+)}{$con{$1}}g;
Я использовал модификатор /x
в первой версии, который позволяет комментировать и игнорирует пробелы. Тебе не обязательно это делать.