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,它允许注释并忽略空格。你不必那样做。
我有一个字符串:
$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,它允许注释并忽略空格。你不必那样做。