Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Perl解析字符串并替换多个符号_String_Perl_Substitution - Fatal编程技术网

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_