首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用my()可以极大地改变XML::Bare行为

使用my()可以极大地改变XML::Bare行为
EN

Stack Overflow用户
提问于 2012-07-12 09:19:22
回答 2查看 296关注 0票数 2

当我运行这个Perl脚本时:

代码语言:javascript
复制
#!/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()中:

代码语言:javascript
复制
#!/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";} 

我得到以下输出:

代码语言:javascript
复制
KEY: _z 
KEY: _i 
KEY: xml 
KEY: _pos 

为什么my()会如此彻底地改变这种行为,特别是考虑到我处于顶层,而my()应该完全没有影响?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 09:35:12

首先,您的Perl脚本应该始终以

代码语言:javascript
复制
use strict;
use warnings;

这将迫使你用my来声明你的所有变量,这会捕捉到许多打字错误和简单的错误。

在本例中,导致行为改变的实际上不是my,而是圆括号,它将$ob放入列表上下文中。

查看XML::Bare的source,我们在构造函数中发现:

代码语言:javascript
复制
sub new { 
    ...
    bless $self, $class;
    return $self if ( !wantarray );
    return ( $self, $self->parse() );
}

注意,第二个return行为您调用了新对象上的->parse,您在第一个示例中忘记了这一点,这就是为什么第一个示例中没有任何数据的原因。

所以你可以说

代码语言:javascript
复制
my $obj = XML::Bare->new(text=>'<xml><name>Bob</name></xml>'); # in scalar context
$obj->parse;

代码语言:javascript
复制
my ( $obj ) = XML::Bare->new(text=>'<xml><name>Bob</name></xml>'); # in list context

它们应该是等价的。

这是一个非常奇怪的界面选择,但我不熟悉XML::Bare

还要注意,我避免了间接方法语法(用new XML::Bare代替XML::Bare->new)。这有助于避免一些nasty problems

票数 11
EN

Stack Overflow用户

发布于 2013-04-27 02:33:43

Bare模块被有意设计为以两种不同的方式工作。

方法#1:

代码语言:javascript
复制
my $ob = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->parse();

方法#2:

代码语言:javascript
复制
my ( $ob, $tree ) = XML::Bare->new( text => "<xml/>" );

您正在以一种未记录的方式使用模块#3:

代码语言:javascript
复制
my ( $ob ) = XML::Bare->new( text => "<xml/>" );
my $tree = $ob->{'xml'};

第三种方式恰好有效,因为模块将树存储在它自己的对象中。我建议避免以这种方式使用它,因为它令人困惑,并且在模块的未来版本中可能会发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11443834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档