0

我工作的地方有一段我们需要与 Perl 交互时使用的代码。基本上我们调用一个函数,它通过一系列字符串——通过命令行——作为一个数组传入 Perl。这适用于大多数事情。

但是我现在需要传递一串 XML 数据。我通常使用 shift 关键字从数组中提取项目。但是,因为 xml 字符串中有多个空格,所以这不起作用。

我试过这样写:

while(shift)
{
   my $temp = shift;
   $animalXML = $animalXML.$temp;

}

但它并不能很好地处理 xml 标签。例如,本节:

<?xml version="1.0" encoding="utf-16"?><ToggleExclusion   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

被读取并存储为:

version="1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

有人知道我该如何处理吗?

谢谢。

4

3 回答 3

3

这不是 Perl 问题,而是命令行引用问题。如果正确引用字符串,它将作为单个 ARGV 项进入 Perl 脚本,您无需进行任何操作。

于 2011-03-21T13:12:45.493 回答
1

您正在编写单个字符串并将其传递给Run,然后显然(这是哪种语言和平台?)将其提供给解析该命令行的命令行解释器(cmd??/bin/sh),将其解释为命令的名称和参数, 并使用参数调用命令。

命令行解释器有自己的具有特殊含义的特殊字符,例如<,因此所有出现的此类字符都需要使用命令行解释器支持的任何方法正确转义或引用,以便不受伤害地传递给命令。此外,命令行解释器将对所使用的字符集有一定的期望,这些期望可能不适用于全为 UTF-16 或更糟的是 UTF-16 和其他内容的混合输入字符串。

如果您无法更改 Perl 脚本:删除命令行解释器,通过使用它的多参数变体Run直接调用带参数的命令。

如果您可以更改 Perl 脚本:像专业人士那样做,并使其从标准输入而不是命令行参数中读取其输入。

另一个想法是不要将 XML 与非 XML 混合,因此您可以使用适当的 XML 库(例如XML::LibXML)来解析输入,这将处理 XML 内容的任何进一步引用/转义问题。

于 2011-03-21T13:31:24.960 回答
0

阅读task.Run. 问题源于那里。你正在寻找一种方式

  • 要么绕过外壳
  • 或引用 shell 的参数。
于 2011-03-21T13:35:00.030 回答