Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用my()会彻底改变XML::Bare的行为_Xml_Perl - Fatal编程技术网

使用my()会彻底改变XML::Bare的行为

使用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()

当我运行此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()
应该没有任何影响吗?

首先,您应该始终以

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'};