Perl 解析一个字符串并替换多个符号

Perl parse a string and substitute multiple symbols

我有一个字符串:

$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"

我想在没有任何模块的情况下进行。我怎样才能做到这一点?谢谢。

您可以替换为变量。 s/// 的左侧可以是哈希值。

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

$str =~ s{
  (              # capture group for 
     \          # the backslash in your '$JVM' hash key
     $          # a literal dollar sign
     [A-Z0-9_]+  # variable name
  )
}{$con{}}gx;
print $str;

请注意,在您的 $str 中,您想使用单引号 '' 而不是 interpolation,否则您会收到错误消息,因为您没有$JVM变量。

同时,你需要注意你的哈希键。如果它们真的是 '$JVM' 之类的,那意味着它们中有一个字面反斜杠 \ 和一个字面美元 $。因此在模式中我们需要三个反斜杠 \\。两个用于获取字面值(因为反斜杠在正则表达式中转义具有特殊含义的内容),一个用于转义美元。

如果您的键没有这个反斜杠,模式就会改变。

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

$str =~ s{($[A-Z0-9_]+)}{$con{}}g;

我在第一个版本中使用了/x modifier,它允许注释并忽略空格。你不必那样做。