2012-07-12 2 views
2

변경 :사용하여 내() 나는이 펄 스크립트를 실행하면 XML :: 베어 행동이 크게

#!/bin/perl 
use XML::Bare; 
$ob = new XML::Bare(text=>'<xml><name>Bob</name></xml>'); 
for $i (keys %{$ob->{xml}}) {print "KEY: $i\n";} 

을 내가 더 출력을 얻을 수 없습니다. 그러나, 나는이 my() 내부 $ob을 넣어 :

#!/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()은 전혀 효과가 없어야합니까? 모든

답변

12

먼저, 당신은 항상 이렇게하면 많은 오타 및 간단한 실수를 잡는다 my에 모든 변수를 선언 강제

use strict; 
use warnings; 

와 Perl 스크립트를 시작해야한다.

경우에 따라 변경된 동작을 발생시키는 것은 실제로 my이 아니지만 괄호는 목록 컨텍스트에 $ob이됩니다. XML :: 베어의 source 보면

, 우리는 생성자에서이 찾기 :

두 번째 return 라인은 당신이 할 잊었 당신을 위해 새 개체에 ->parse 호출 공지 것을
sub new { 
    ... 
    bless $self, $class; 
    return $self if (!wantarray); 
    return ($self, $self->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을 피할 수 있습니다.

+0

감사! 이전에 parse()를 사용 했었지만 my()가 자동 구문 분석을 수행하는 것처럼 보였을 때 놀랐습니다. 나는 "my $ foo"가 "my ($ foo)"와 같다고 잘못 생각하고있다. – barrycarter

+2

'my ($ foo)'는'(my $ foo)'와 같고'(...) ='는 Perl에게 스칼라 지정 연산자 대신 목록 할당 연산자를 사용하도록 지시합니다. [미니 튜토리얼 : 스칼라 대리스트 할당 연산자] (http://www.perlmonks.org/?node_id=790129)를 참조하십시오. – ikegami

1

XML :: Bare 모듈은 의도적으로 2 가지 다른 방식으로 작동하도록 설계되었습니다.

방법 # 1 :

my $ob = XML::Bare->new(text => "<xml/>"); 
my $tree = $ob->parse(); 

방법 # 2 :

my ($ob) = XML::Bare->new(text => "<xml/>"); 
my $tree = $ob->{'xml'}; 

이 세 번째 방법은 어떻게됩니까 : 당신은 문서화되지 않은 방법 # 3의 모듈을 사용하는

my ($ob, $tree) = XML::Bare->new(text => "<xml/>"); 

모듈은 자신의 객체 내에 트리를 저장하기 때문에 작동합니다. 혼란스럽고 모듈의 차후 버전에서 변경 될 수 있기 때문에 이런 식으로 사용하지 않는 것이 좋습니다.

관련 문제