使用my()会彻底改变XML::Bare的行为
当我运行此Perl脚本时:使用my()会彻底改变XML::Bare的行为,xml,perl,Xml,Perl,当我运行此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";} 我得到这个输出: KEY: _z KEY: _i KEY: xml KEY: _pos 为什么my() 我处于顶层,my()
#!/bin/perl
use XML::Bare;
$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()
应该没有任何影响吗?首先,您应该始终以
use strict;
use warnings;
这将迫使您使用my
声明所有变量,这会捕获许多打字错误和简单错误
在您的例子中,实际上导致行为更改的不是my
,而是将$ob
放在列表上下文中的括号
查看XML::Bare的定义,我们在构造函数中发现:
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=>Bob');#在标量上下文中
$obj->parse;
或
my($obj)=XML::Bare->new(text=>Bob');#在列表上下文中
它们应该是等价的
这是一个非常奇怪的界面选择,但我不熟悉XML::Bare
还要注意,我避免了使用间接方法语法(XML::Bare->new
,而不是newxml::Bare
)。这有助于避免一些错误。XML::Bare模块被有意设计为以两种不同的方式工作
道路#1:
my$ob=XML::Bare->new(text=>“”);
my$tree=$ob->parse();
道路#2:
my($ob,$tree)=XML::Bare->new(text=>“”);
您以未记录的方式使用模块#3:
my($ob)=XML::Bare->new(text=>“”);
my$tree=$ob->{'xml'};
第三种方法正好有效,因为模块将树存储在自己的对象中。我建议避免以这种方式使用它,因为它令人困惑,并且可能会在模块的未来版本中发生更改。谢谢!我之前使用过parse(),但当my()似乎在进行自动解析时,我感到惊讶。我一直错误地认为“my$foo”等同于“my$foo”。my$foo
等同于(my$foo)
,并且(…)=
告诉Perl使用列表赋值运算符而不是标量赋值运算符。看见
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
my $ob = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->parse();
my ( $ob, $tree ) = XML::Bare->new( text => "<xml/>" );
my ( $ob ) = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->{'xml'};