当我运行这个Perl脚本时:
#!/bin/perl
use XML::Bare;
$ob = new XML::Bare(text=>'<xml><name>Bob</name></xml>');
for $i (keys %{$ob->{xml}}) {print "KEY: $i\n";} 我没有得到任何输出。但是,如果我将$ob放在my()中:
#!/bin/perl
use XML::Bare;
my($ob) = new XML::Bare(text=>'<xml><name>Bob</name></xml>');
for $i (keys %{$ob->{xml}}) {print "KEY: $i\n";} 我得到以下输出:
KEY: _z
KEY: _i
KEY: xml
KEY: _pos 为什么my()会如此彻底地改变这种行为,特别是考虑到我处于顶层,而my()应该完全没有影响?
发布于 2012-07-12 09:35:12
首先,您的Perl脚本应该始终以
use strict;
use warnings;这将迫使你用my来声明你的所有变量,这会捕捉到许多打字错误和简单的错误。
在本例中,导致行为改变的实际上不是my,而是圆括号,它将$ob放入列表上下文中。
查看XML::Bare的source,我们在构造函数中发现:
sub new {
...
bless $self, $class;
return $self if ( !wantarray );
return ( $self, $self->parse() );
}注意,第二个return行为您调用了新对象上的->parse,您在第一个示例中忘记了这一点,这就是为什么第一个示例中没有任何数据的原因。
所以你可以说
my $obj = XML::Bare->new(text=>'<xml><name>Bob</name></xml>'); # in scalar context
$obj->parse;或
my ( $obj ) = XML::Bare->new(text=>'<xml><name>Bob</name></xml>'); # in list context它们应该是等价的。
这是一个非常奇怪的界面选择,但我不熟悉XML::Bare。
还要注意,我避免了间接方法语法(用new XML::Bare代替XML::Bare->new)。这有助于避免一些nasty problems。
发布于 2013-04-27 02:33:43
Bare模块被有意设计为以两种不同的方式工作。
方法#1:
my $ob = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->parse();方法#2:
my ( $ob, $tree ) = XML::Bare->new( text => "<xml/>" );您正在以一种未记录的方式使用模块#3:
my ( $ob ) = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->{'xml'};第三种方式恰好有效,因为模块将树存储在它自己的对象中。我建议避免以这种方式使用它,因为它令人困惑,并且在模块的未来版本中可能会发生变化。
https://stackoverflow.com/questions/11443834
复制相似问题