String Perl解析字符串并替换多个符号
我有一根绳子:String Perl解析字符串并替换多个符号,string,perl,substitution,String,Perl,Substitution,我有一根绳子: $str = "\$JVM/\$JAVA8/Contents/Home" 在这个字符串上,我想用这个散列中相应的键替换符号$JVM和$JAVA8: %con = ('\$JVM' => '/Library/Java/JavaVirtualMachines' , '\$JAVA8' => 'jdk1.8.0_192.jdk'); 这样我就可以得到这个: $target = "/Library/Java/JavaVirtualMachines/jdk1
$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"
我想不带任何模块。我该怎么做?谢谢。您可以替换为变量。的左侧可以是散列值
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;
我在第一个版本中使用了,它允许注释并忽略空白。您不必这样做。如果字符串是
“$JVM/…”,那么您将得到一个编译时错误,因为您没有声明$JVM`变量。双引号“
使Perl插入变量。您可能没有在代码中写入此字符串,而是将其作为输入读取。这是完全不同的事情,如果你的问题发生了变化,这会改变你的意思。请具体说明。实际上,我已经从%ENV读取了str。当从中读取时,它是“$JVM/$JAVA8/Contents/Home”,但这不是问题所在。问题在于找到一种实用的方法,用哈希表中的键值替换这些符号。谢谢。如果“您没有$JVM变量,将出现错误”,则不会,但您将得到$JVM/..
而不是\$JVM/..
。谢谢您的回答。我已经尝试过了,但是我的代码包含一些带有“u”的符号,例如“$JAVA_HOME”,对于这些符号,它返回相同的结果。我没有谈论过其他符号来缩短问题。@ikegami问题已编辑。最初是“$JVM/…”
,所以我的注释是正确的。@Romario你知道正则表达式吗?您还需要更改模式以使用下划线。请试着理解答案和其中的代码,而不是盲目地复制它。如果你这样做,你最终会从互联网上复制并运行坏代码,并对你的计算机造成伤害。当然我知道正则表达式。我在括号内加了uu,但$str仍然返回原始值或其他错误结果。顺便说一句,在这些符号中有一些像JAVA_HOME_,JAVA8_