【问题标题】:How to disable string interpolation when printing a variable with special characters?打印带有特殊字符的变量时如何禁用字符串插值?
【发布时间】:2013-09-23 13:34:08
【问题描述】:

在 Perl 中,我使用 XML::Twig 来读取 XML 文件。一些属性的文本如下所示:

<p>Here is some text.</p>

<p>Some more text.

我正在将此属性读入名为$Body 的变量中。我想将此变量打印到文件中而不插入字符串中的特殊字符,即输出应该看起来与输入完全相同。我的代码如下:

open (my $OUT, ">", "out.csv") or die $!;
print $OUT $Body;

但是,当我查看 out.csv 时,我看到:

<p>Here is some text.</p>

<p>Some more text.

相反,我想查看原始字符串:

&lt;p&gt;Here is some text.&lt;/p&gt;&#xA&;#xA;&lt;p&gt;Some more text.

我尝试了以下方法但没有成功:

  • print $OUT '$Body'; 不起作用,只显示“$Body”
  • print $OUT "$Body"; 不起作用,和没有引号一样。
  • print $OUT qw{$Body}; 不起作用,只显示“$Body”。

    这是一个完整的例子:

tmp.xml

<?xml version="1.0" encoding="utf-8"?>
<root>
  <node Body="&lt;p&gt;Here is some text.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Some more text."/>
</root>

代码:

#!/usr/bin/perl
use strict;
use XML::Twig;

my $t=XML::Twig->new();
$t->parsefile("tmp.xml"); 

my $root= $t->root;

open (my $OUT, ">", "out.csv") or die();

my @nodes = $root->children('node');   # get the para children
foreach my $node (@nodes){ 
    my $Body = $node->{'att'}->{'Body'}; 
    print $OUT $Body;
}

结果:

[dev@mogli:/swta] $ ./script.pl 
[dev@mogli:/swta] $ cat out.csv 
<p>Here is some text.</p>

<p>Some more text.

【问题讨论】:

  • 你确定你没有在转换文件中查看文件吗?它可能工作正常。
  • @Ian:我正在使用 vim 查看文件,它不会转换这些字符。

标签: perl xml-twig string-interpolation


【解决方案1】:

XML::Twig 正在解编码。将keep_encoding 标志传递给它以防止这种情况发生:

my $t = XML::Twig->new(keep_encoding => 1);

【讨论】:

    【解决方案2】:

    打印一个标量不会改变它[1].

    $ cat a.pl
    $Body = '&lt;p&gt;Here is some text.&lt;/p&gt;&#xA&#xA&lt;p&gt;Some more text.';
    open (my $OUT, ">", "out.csv") or die();
    print $OUT $Body;
    
    $ perl a.pl
    
    $ cat out.csv
    &lt;p&gt;Here is some text.&lt;/p&gt;&#xA&#xA&lt;p&gt;Some more text.
    

    $Body 不包含您认为的内容。 XML::Twig 正确返回了节点的内容&amp;amp;lt;p&amp;amp;gt;Here ...。如果假设节点包含&amp;amp;lt;p&amp;amp;gt;Here ...,则XML 文件应包含&amp;amp;lt;p&amp;amp;gt;Here ...


    注意事项:

    1. 除非您通过添加 :encoding 层或类似的方式来指示它,或者除非您在 Windows 上默认将 LF 更改为 CRLF。

    【讨论】:

    • 请查看我更新的问题。在您的情况下,您正在使用单引号创建 $Body,这是可行的。但是,我正在使用 XML::Twig 从输入文件中读取$Body。也许这是我的问题;读取是在做插值,而不是写入?
    • 相应调整。
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2014-03-18
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多