如何在打印带有特殊字符的变量时禁用字符串插值?

时间:2013-09-23 13:34:08

标签: perl xml-twig string-interpolation

在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.

2 个答案:

答案 0 :(得分:8)

XML :: Twig正在进行解码。传递keep_encoding标志以防止这种情况:

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

答案 1 :(得分:3)

打印标量不会改变 [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正确返回了节点的内容<p>Here ...。如果节点包含&lt;p&gt;Here ...,则XML文件应包含&amp;lt;p&amp;gt;Here ...


注意:

  1. 除非您通过添加:编码层或其他类型来指示它,或者除非您在Windows上默认将LF更改为CRLF。