2014-12-05 2 views
1

Perl에서 오류가 발생하고 이유를 찾을 수 없습니다. 오류Perl에서 배열 참조 오류가 아닙니다.

: 내 유틸리티 파일에서 다음 Service.pm에서 배열이 아닌 참조, 라인 (20)

my $array = [ { name => 'George', surname => 'Marley' } ]; 
my $helper = CustMessage->new(); 
$helper = CustMessage->getMessage($array); 

내가 가진 :

sub getMessage { 
    my ($self, $args) = @_; 
    my $stringsArray = shift; 

    my $strings = Service->new({ 
     serviceId => $self->_serviceId(), 
    }); 

    return unless $strings; 

    $strings->getStrings($stringsArray); 
} 

다음 서비스 방법에 있습니다

sub getStrings { 
    my ($stringsArray, $self) = shift; 
    my @keys = map({ $_->{'name'} } @{$stringsArray}); 
    my $key = join('', @keys); 
    $key = MIME::Base64::encode($key); 

    my %results; 
    $results{$key} = $self->_callStrings->($stringsArray); 
    $results{$key}->initialize(); 

    $results{$key} = $self->{serviceCalls}->{getStrings}; 
    return $self->{serviceCalls}->{getStrings}; 
} 

오류는 Service.pm의 getStrings 메서드의 두 번째 줄에 있습니다.

,210
my @keys = map({ $_->{'name'} } @{$stringsArray}); 
+0

이 누락 시도 할 수 있을까? – choroba

+0

멋지게 발견되었지만 불행히도 그게 문제가 아닙니다. 실수로 복사 및 붙여 넣기를하는 동안 실수로 제거했다고 생각하십시오 (이상하게 보입니다). – snakespan

+0

왜'$ helper'가 먼저 객체인지 그리고'getMessage'의 결과 값을 재 할당 했습니까?나는 다음과 같은 것을 보는데 익숙하다.'my $ helper = CustMessage-> new(); 내 $ msg = $ 도우미 -> getMessage ($ 배열);'. '$ helper'를 객체로 다시 사용하지 않으면 재 할당이 제대로 작동할까요? 이것은 전형적인 패턴입니까? –

답변

1

RE: I'm getting an error in Perl and I can't work out why. Error: Not an ARRAY reference at Service.pm, line 20

getStrings() 객체 방법이므로

my ($self, $stringsArray) = @_; 

대신

my ($stringsArray, $self) = shift; 
# $self is always undef here due one element list assignment 

의 시도 인스턴스 항상 @_ 배열의 첫번째 요소 오브젝트.

+0

https://eval.in/230979 –

+1

위의 답변에서 투표가 실패 할 때 어떤 부분이 잘못 되었습니까? –

2

선들

my $helper = CustMessage->new(); 
$helper = CustMessage->getMessage($array); 

매우 홀수이다. 당신은 그것을 버리고

CustMessage->getMessage($array); 

의 결과로 덮어 즉시 $helper의 새로운 CustMessage 객체를 생성되고하는 것은 어떤 떨어져에 갈 수있는 상속에서,

getMessage('CustMessage', $array); 

과 동일 나는 당신이 당신의 "유틸리티 파일"

getMessage 때문에이 같은 인수를 수신 호출로 당신이 진짜 클래스를 정의하지 않아도 의심하고

my ($self, $args) = @_; 
my $stringsArray = shift; 

당신은

($self, $args) = ('CustMessage', $array) 
$stringsArray = 'CustMessage' 

왼쪽과 배열 지령 상실 있도록 다시 $args를 사용하지 않습니다.

내가 말했듯이, 적절한 CustMessage.pm 파일이 없기 때문에 내가 실제로 원하는 것인지 확신 할 수 없습니다. `;하지만 당신은,``내 ($ stringsArray $ 자체) = 이동에`

my $helper = CustMessage->new; 
my $message = $helper->getMessage($array); 

다음

sub getMessage { 
    my ($self, $stringsArray) = @_; 

    ... 
} 
+0

일종의 오프 주제에 대한 일종의 (문제가 해결 된 것 같아요) 위의 내 의견을 참조하십시오 :'my $ helper = CustMessage-> new(); ... 단지 불필요한 코드인가? –

+0

@ G.Cito : 대답에 대한 대답이 문제의 모든 오류를 잡아 먹는 것은 확실하지 않지만 OP는 행복해 보입니다. 첫 번째 단락을 살펴보십시오. OP 코드가 올바른 CustMessage.pm 모듈을 작성했는지 확신 할 수는 없지만 코드 줄에 대해 동의합니다. "유틸리티 파일"* – Borodin

관련 문제