2014-03-26 53 views
0

想使用的Any.pm模塊,我已經下載了模塊,並與下面的代碼,現在所面臨的誤差未定義子程序及主要::叫在Any.pm問題與主題::隊列::任何

「未定義的子程序&主要::叫在Any.pm線52」

代碼:

use lib "/threads-module/Thread-Queue-Any-1.14/lib/"; 
require "/threads-module/Thread-Queue-Any-1.14/lib/Thread/Queue/Any.pm"; 
our $wt_to_mt_queue = Thread::Queue::Any->new(); 

$wt_to_mt_queue->enqueue($reference); 

不知道缺什麼?

+1

是否有一個特定的原因,你正在做'require',而不是'使用Thread :: Queue :: Any;'?此外,該方法是「入隊」,而不是「入隊」。這個空間是一個隨機的複製和粘貼神器嗎? – Miller

+0

我試圖與「使用」爲好,我面臨着同樣的problem.Its打字錯誤,我在我的代碼 – rvkreddy

+0

使用排隊'our'?!?!?!你永遠不應該用'我們'!使用'my'。 – ikegami

回答

4

我試圖利用cpan Thread::Queue::Any,然後運行以下腳本首先安裝Thread::Queue::Any重現此錯誤:

use strict; 
use warnings; 

use Thread::Queue::Any; 

my $reference; 
our $wt_to_mt_queue = Thread::Queue::Any->new(); 
$wt_to_mt_queue->enqueue($reference); 

此完成,沒有警告或錯誤

然後我進去看了source of Thread::Queue::Any和第50-52行如下:

sub enqueue { 
    return shift->SUPER::enqueue($FREEZE->(\@_)); 
} #enqueue 

這裏調用的唯一子程序是$FREEZE,它更接近於源,由第151行的import方法初始化(我們可以看到現在的位置)。

所以我就決定要複製您的require使用,但首先我必須找出在我的Thread::Queue::Any躲在:

use Thread::Queue::Any; 
use Data::Dump; 

dd \%INC; 

顯然,它在"Thread/Queue/Any.pm" => "C:/strawberry/perl/site/lib/Thread/Queue/Any.pm",。所以,以反映您的require使用,我做的:

use strict; 
use warnings; 

#use Thread::Queue::Any; 
require 'C:/strawberry/perl/site/lib/thread/Queue/Any.pm'; 

my $reference; 
our $wt_to_mt_queue = Thread::Queue::Any->new(); 
$wt_to_mt_queue->enqueue($reference); 

而這給了我下面的輸出:

Use of uninitialized value in subroutine entry at C:/strawberry/perl/site/lib/thread/Queue/Any.pm line 51. 
Use of uninitialized value in subroutine entry at C:/strawberry/perl/site/lib/thread/Queue/Any.pm line 51. 
Can't use string ("") as a subroutine ref while "strict refs" in use at C:/strawberry/perl/site/lib/thread/Queue/Any.pm 
line 51. 

現在,這並不能完全反映你的錯誤,但我仍然斷定你」重新不​​使用模塊,實際上不是using模塊。

還給出了模塊存儲在系統中的位置,我懷疑你實際上沒有安裝你應該使用cpan或其中的一個等價物。

+0

它幫助我解決至少這個錯誤,但現在我看到一個全新的錯誤。在排隊的錯誤是不能在BLIB存儲代碼的項目/ lib目錄/ Storable.pm(自動分割成BLIB/lib目錄/自動/存儲/ _freeze.al)線339,在/home/threadsmodule/Thread-Queue-Any-1.14 /lib//Thread/Queue/Any.pm line 54 – rvkreddy

+0

也許用新的錯誤開始一個新的問題? – Miller

+0

我嘗試了以下方法:'我的$ ref = sub {print「hello」; }; $ wt_to_mt_queue-> enqueue($ ref);'並且得到相同的錯誤。但是,這個模塊似乎不是用來存儲代碼引用,只是數據結構。閱讀文檔。 – Miller

0

如果你傳遞完整的路徑來請求,爲什麼還要麻煩設置lib?以下是優於你有什麼:

use lib "/threads-module/Thread-Queue-Any-1.14/lib"; 
require "Thread/Queue/Any.pm"; 

更妙的是:

use lib "/threads-module/Thread-Queue-Any-1.14/lib"; 
require Thread::Queue::Any; 

但爲什麼您使用require ???

use lib "/threads-module/Thread-Queue-Any-1.14/lib"; 
use Thread::Queue::Any qw(); 

qw()表示您不想從模塊導入任何東西。不幸的是,主題::隊列::任何已在import子關鍵邏輯 - 這是一個糟糕的設計 - 所以一個個有使用他以下幾點:

use lib "/threads-module/Thread-Queue-Any-1.14/lib"; 
use Thread::Queue::Any; 

這將導入默認出口 - 其中有none - 但它最終還是會調用T :: Q :: A中錯位的代碼。