Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Perl问题。需要一种方法来替换同一行上的两个变量吗_Perl - Fatal编程技术网

Perl问题。需要一种方法来替换同一行上的两个变量吗

Perl问题。需要一种方法来替换同一行上的两个变量吗,perl,Perl,我正试图用Perl编写一个替换脚本,我让它半途而废,但似乎无法替换同一行中的两个字符串 我有一个名为foo.json的json文件,其中包含以下行:标题:%CLIENT%Dashboard Web Map%WEBMAPENV% 现在,我有了第二个名为env.txt的文件,其中包含我希望使用的所有变量。在此文件中,有一个名为:%WEBMAPENV%=Test-Dev的条目。我的目标是让PERL读取文件env.txt,同时替换%CLIENT%和%WEBMAPENV% 以下是我目前的代码: my $e

我正试图用Perl编写一个替换脚本,我让它半途而废,但似乎无法替换同一行中的两个字符串

我有一个名为foo.json的json文件,其中包含以下行:标题:%CLIENT%Dashboard Web Map%WEBMAPENV%

现在,我有了第二个名为env.txt的文件,其中包含我希望使用的所有变量。在此文件中,有一个名为:%WEBMAPENV%=Test-Dev的条目。我的目标是让PERL读取文件env.txt,同时替换%CLIENT%和%WEBMAPENV%

以下是我目前的代码:

my $envFilePath = "$dirScripts/env/env.txt";

# Reading Firebase variables from Test environment file.
open($fh, "<", $envFilePath);

while (my $line=<$fh>) {
  if ($line eq "\n") {
    next;
  }

  if ($line =~ m/^(%\w+%)=/) {
    $cur_key = $1;

    $line =~ s/$cur_key=//;

    $replacements{$cur_key} = $line;
  } else {
    $replacements{$cur_key} .= $line;
  }
}
我每行只能替换一个变量,但我需要能够处理2个

有人能帮忙吗


德里克

你只检查一个

 if ($line =~ m/(%\w+%)/) { ... }
解决方案:

使用前请清理%的替换件。 选择值%replacements; 为了我的$line?{ $line=~s{%\w+%}{$replacements{$1}/$1}例如; } 通过使用/g在s///内部添加一个循环,而不是在s///周围添加一个循环,如果值包含%,则此循环不会出错

/e表示替换将作为Perl代码运行

//是定义的or运算符。它的工作原理类似于| |,但寻找的是明确的而不是真理


有关更多信息,请参阅。您只需检查一个

 if ($line =~ m/(%\w+%)/) { ... }
解决方案:

使用前请清理%的替换件。 选择值%replacements; 为了我的$line?{ $line=~s{%\w+%}{$replacements{$1}/$1}例如; } 通过使用/g在s///内部添加一个循环,而不是在s///周围添加一个循环,如果值包含%,则此循环不会出错

/e表示替换将作为Perl代码运行

//是定义的or运算符。它的工作原理类似于| |,但寻找的是明确的而不是真理


有关更多信息,请参阅。

提示:永远不要使用Tie::File。它不会使代码变得更简单;它不会节省内存,而且会使速度降低30倍!如果可能,请使用现有的模板库,例如。它功能更强大,错误更少,文档记录也更好。Tie::File有它的用途,但它不适合简单地遍历这样的文件。它不能用于大型文件,因为它保留了文件中每一行的索引。这高于其缓存中的任何内存量。虽然可以控制缓存的大小,但无法控制索引的大小。这意味着对于平均行较短的文件,File::Tie使用的内存比将整个文件加载到内存中所需的内存还要多。因此,如果没有足够的内存来加载整个文件,那么就没有足够的内存来使用Tie::file。那么,短文件呢?嗯,使用短文件是没有意义的。巨大的速度损失意味着您可能只需将短文件完全读入内存即可。对于一些简单的操作,我将T::F的时间延长了30倍。提示:永远不要使用Tie::File。它不会使代码变得更简单;它不会节省内存,而且会使速度降低30倍!如果可能,请使用现有的模板库,例如。它功能更强大,错误更少,文档记录也更好。Tie::File有它的用途,但它不适合简单地遍历这样的文件。它不能用于大型文件,因为它保留了文件中每一行的索引。这高于其缓存中的任何内存量。虽然可以控制缓存的大小,但无法控制索引的大小。这意味着对于平均行较短的文件,File::Tie使用的内存比将整个文件加载到内存中所需的内存还要多。因此,如果没有足够的内存来加载整个文件,那么就没有足够的内存来使用Tie::file。那么,短文件呢?嗯,使用短文件是没有意义的。巨大的速度损失意味着您可能只需将短文件完全读入内存即可。对于一些简单的操作,我用了30倍的时间来记录T::F。感谢@Schwern的贡献。感谢@Schwern的贡献。