2014-12-05 41 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方法的第2行上:

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

缺少'''在我的($ stringsArray $個體經營)=移位;'? – choroba 2014-12-05 11:17:52

+0

很好的發現,但不幸的是,這不是問題。想想我在複製和粘貼時意外刪除了(有奇怪的)。 – snakespan 2014-12-05 11:28:02

+0

爲什麼'$ helper'是一個對象,然後重新分配'getMessage'輸出的值?我更習慣於看到諸如:my $ helper = CustMessage-> new();我的$ msg = $ helper-> getMessage($ array);'。我猜如果你不再使用'$ helper'作爲對象,那麼重新分配的工作?這是典型的模式嗎? – 2014-12-05 14:43:48

回答

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

嘗試的

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

代替

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

getStrings()以來是對象方法和對象實例總是在@_數組第一個元素。

+0

https://eval.in/230979 – 2014-12-05 11:41:33

+1

請在下面的投票中評論上述答案中的哪一部分是錯誤的。 – 2014-12-05 13:54:35

2

線條

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

很奇怪。您正在創建$helperCustMessage對象,並立即將其丟棄,並用

CustMessage->getMessage($array); 

結果覆蓋它,其除了可能進行的任何遺產,是相同的

getMessage('CustMessage', $array); 

和我懷疑你沒有定義一個真實的類,因爲你稱之爲你的「工具文件」

因爲getMessage收到它的這樣的參數

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

你留下了

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

,你不會再使用$args所以你的數組引用丟失。

我不能確定你真正想要什麼,因爲正如我所說的,我懷疑你沒有合適的CustMessage.pm文件。但你可以嘗試

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

然後

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

    ... 
} 
+0

OP關閉主題的分類(我猜想問題已解決),但請參閱上面有關「my $ helper = CustMessage-> new()」的註釋。 ......這只是多餘的代碼嗎? – 2014-12-05 14:46:16

+0

@ G.Cito:我不清楚接受的答案是否能捕捉到問題中的所有錯誤,但OP看起來很開心。看看我的第一段 - 你會發現我對你的代碼行表示贊同,儘管我不敢肯定OP已經寫了一個正確的CustMessage.pm模塊,因爲他稱之爲他的* 「實用程序文件」* – Borodin 2014-12-05 16:31:45