Perl разбирает строку и подставляет несколько символов - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть строка:

$str = "\$JVM/\$JAVA8/Contents/Home"

В этой строке я хотел бы заменить символы $ JVM и $ JAVA8 насоответствующие ключи из этого хеша:

%con = ('\$JVM' => '/Library/Java/JavaVirtualMachines' ,
        '\$JAVA8' => 'jdk1.8.0_192.jdk');

Чтобы я мог получить это:

$target = "/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home"

Я хотел бы сделать это без каких-либо модулей.Как я могу это сделать?Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете заменить переменную. Левая часть 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 в первой версии, который позволяет комментировать и игнорирует пробелы. Тебе не обязательно это делать.

...