【问题标题】:Perl parse a string and substitute multiple symbolsPerl 解析字符串并替换多个符号
【发布时间】:2019-04-19 20:39:44
【问题描述】:

我有一个字符串:

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

我想不使用任何模块。我怎样才能做到这一点?谢谢。

【问题讨论】:

  • 如果你的字符串是"$JVM/..." then you'll get a compile time error, because you don't have a $JVM`变量声明。双引号 "" 使 Perl interpolate 变量。您可能没有在代码中写入此字符串,而是将其作为输入读取。这是完全不同的事情,如果你的问题改变了意义。请具体。
  • 实际上,我从 %ENV 读取了那个 str。当从中读取时,它是 "$JVM/$JAVA8/Contents/Home" 但这不是问题。问题是找到一种实用的方法来用哈希表中的键值替换这些符号。谢谢。

标签: string perl substitution


【解决方案1】:

您可以替换为变量。 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 中,您要使用单引号 '' 而不是 interpolation,否则您将收到错误消息,因为您没有 $JVM 变量。

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

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

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

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

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

【讨论】:

  • Re "你会得到一个错误,因为你没有 $JVM 变量",不,但你会得到$JVM/... 而不是\$JVM/... .
  • 感谢您的回答。我已经尝试过了,但是我的代码包含一些具有 '_' 的符号,例如像 '$JAVA_HOME' 并且对于那些符号它返回相同。为了简短起见,我没有谈论其他符号。
  • @ikegami 问题已被编辑。最初是"$JVM/...",所以我的注释是正确的。
  • @Romario 你知道正则表达式吗?您还需要更改模式以使用下划线。请尝试了解答案和其中的代码,而不是盲目地复制它。如果这样做,您最终会从互联网上复制和运行不良代码,并对您的计算机造成损害。
  • 我当然知道正则表达式。我在括号内添加了 _ 但 $str 仍然返回原始值或其他错误结果。顺便说一句,其中的符号有 JAVA_HOME_ , JAVA8_
猜你喜欢
  • 2022-01-08
  • 2012-01-22
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多