【问题标题】:Perl Escape Quotes ProblemPerl 转义引号问题
【发布时间】:2011-03-15 17:54:49
【问题描述】:

如果这太琐碎了,请原谅我。

我通过在 Perl 脚本中调用 system() 来执行 XSLT,如下所示:

system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile $inFile $xslFile $saxonParams");

$inFile 是一个字符串,其中包含将使用 XSLT 翻译的 xml 文件的相对路径。除了那些在字符串中有空格的 $inFile 之外,这工作正常,例如“Intro to Dance. htm”,那么就会报语法错误。

如果这是在 MS-DOS 中,那么我可以通过在 XSLT 命令中的 $inFile 字符串周围加上引号来轻松解决这个问题。我确实尝试在上面的命令中添加转义,例如:

system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile \"$inFile\" $xslFile $saxonParams");

它不起作用。任何人都可以帮助我如何在 $inFile 周围加上引号?

谢谢。

【问题讨论】:

    标签: java perl command-line


    【解决方案1】:

    您可以通过将命令行作为列表传递给system 来避免shell(以及因此的shell 转义问题)。试试

    system( 'java', '-Xms256m', '-Xmx512m', '-jar', $saxonJar, '-o', $tmpFile, $inFile, $xslFile, $saxonParams );
    

    有关其工作原理的更多信息,请参阅system 的 perldoc。

    【讨论】:

    • @friedo: 尝试过,但出现如下错误:String found where operator expected at ./mot_publish.pl line 121, near "'java' '-Xms256m'" (Missing operator before '-Xms256m' ?)。你有什么建议吗?
    • 您需要在列表中的每个项目之间使用逗号。
    • @Robert:friedo 的代码看起来是正确的。你确定你复制的正确吗?要么您在复制时出错,要么错误是报告行上方的一两行(这是解析此类错误的一般问题)。编辑:friedo 已经发现了问题。
    • @friedo:对不起,是我的错,我忘了复制逗号,让我再试一次。
    • @friedo:只处理了一些错误。但我实际上想到了另一种更好的方法:我们可以通过将空格替换为下划线来更改存储在磁盘上的实际文件的文件名。我的语句循环遍历目录中的所有文件@pub=ls $sourceDir | grep '\.htm' | grep -v Default | head -550;
    【解决方案2】:

    这实际上是 MS-DOS 吗?

    你说它不起作用,但不是实际发生的事情。你收到错误了吗?那是什么?

    如果这是在 Unixish 系统上,只需替换单引号:

    system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile '$inFile' $xslFile $saxonParams");
    

    我不知道这是否适用于 MS-DOS。

    如果文件名包含"',它会变得有点复杂,因为它们需要在shell 级别保存:

    $inFile =~ s/(['"])/\\$1/g;
    system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile \"$inFile\" $xslFile $saxonParams");
    

    (或类似的东西。)

    更好的是,使用多参数形式:

    system('java', '-Xms256m', '-Xmx512m', '-jar', $saxonJar, '-o', $tmpFile,
           $inFile, $xslFile, $saxonParams);
    

    并让解释器和外壳解决它。

    【讨论】:

    • 谢谢。 "$inFile =~ s/(['"])/\\$1/g;" 是否要用引号将 $inFile 括起来?
    • @Robert :不,它将用\" 替换所有",用\' 替换所有'。换句话说,转义引号以使将整个内容用引号括起来更安全。不过,如果可行的话,多参数解决方案会更好。
    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2013-07-07
    • 2020-11-06
    相关资源
    最近更新 更多