Multithreading 未定义的子程序&;main::在Any.pm问题上使用Thread::Queue::Any调用
我正在尝试使用Any.pm模块,我已经下载了该模块,并使用下面的代码,我面临错误 “未定义的子例程&main::在Any.pm第52行调用” 代码:Multithreading 未定义的子程序&;main::在Any.pm问题上使用Thread::Queue::Any调用,multithreading,perl,Multithreading,Perl,我正在尝试使用Any.pm模块,我已经下载了该模块,并使用下面的代码,我面临错误 “未定义的子例程&main::在Any.pm第52行调用” 代码: 不知道少了什么 我试图重新创建此错误,首先使用cpan-Thread::Queue::Any安装,然后运行以下脚本: use strict; use warnings; use Thread::Queue::Any; my $reference; our $wt_to_mt_queue = Thread::Queue::Any->new(
不知道少了什么 我试图重新创建此错误,首先使用
cpan-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);
此操作完成时没有警告或错误
然后我查看了第50-52行,如下所示:
sub enqueue {
return shift->SUPER::enqueue( $FREEZE->( \@_ ) );
} #enqueue
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any;
这里调用的唯一子例程是$FREEZE
,它通过第151行的import
方法对源代码进行初始化(我们可以看到现在的情况)
因此,我决定重复您对require
的使用,但首先我必须找出我的线程::队列::Any
隐藏的位置:
use Thread::Queue::Any;
use Data::Dump;
dd \%INC;
显然它在“Thread/Queue/Any.pm”=>“C:/草莓/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.
现在,这并没有完全反映您的错误,但我仍然得出结论,您没有正确地使用模块,而不是实际使用模块
另外,考虑到模块存储在系统中的位置,我怀疑您没有实际安装它,您应该使用cpan或其他等效工具安装它。我试图通过首先使用cpan线程::队列::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);
此操作完成时没有警告或错误
然后我查看了第50-52行,如下所示:
sub enqueue {
return shift->SUPER::enqueue( $FREEZE->( \@_ ) );
} #enqueue
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any;
这里调用的唯一子例程是$FREEZE
,它通过第151行的import
方法对源代码进行初始化(我们可以看到现在的情况)
因此,我决定重复您对require
的使用,但首先我必须找出我的线程::队列::Any
隐藏的位置:
use Thread::Queue::Any;
use Data::Dump;
dd \%INC;
显然它在“Thread/Queue/Any.pm”=>“C:/草莓/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.
现在,这并没有完全反映您的错误,但我仍然得出结论,您没有正确地使用模块,而不是实际使用模块
另外,考虑到模块存储在系统中的位置,我怀疑您实际上没有安装它,您应该使用cpan或其他等效工具安装它。如果您将完整路径传递到所需路径,为什么还要设置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()
表示您不想从模块导入任何内容。不幸的是,Thread::Queue::Any在import
sub中有重要的逻辑——这是一个糟糕的设计——因此必须使用以下内容:
sub enqueue {
return shift->SUPER::enqueue( $FREEZE->( \@_ ) );
} #enqueue
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any;
这将导入默认的导出(其中没有导出),但它也会调用T::Q::A中放错位置的代码。如果将完整路径传递给require,为什么还要设置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()
表示您不想从模块导入任何内容。不幸的是,Thread::Queue::Any在import
sub中有重要的逻辑——这是一个糟糕的设计——因此必须使用以下内容:
sub enqueue {
return shift->SUPER::enqueue( $FREEZE->( \@_ ) );
} #enqueue
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any;
这将导入默认的导出(其中没有导出),但它最终也会调用T::Q::A中放错位置的代码。是否有特殊原因使您执行require
,而不是use Thread::Queue::Any代码>?此外,该方法是排队
,而不是排队
。那个空间是随机复制粘贴的产物吗?我也尝试过“使用”,我也面临同样的问题。这是一个输入错误,我在我的代码中使用了enqueue我们的
?!?!?!你不应该使用我们的!使用my
。您执行require
,而不是使用Thread::Queue::Any,是否有特殊原因代码>?此外,该方法是排队
,而不是排队
。那个空间是随机复制粘贴的产物吗?我也尝试过“使用”,我也面临同样的问题。这是一个输入错误,我在我的代码中使用了enqueue我们的
?!?!?!你不应该使用我们的!使用my
。它至少帮助我解决了这个错误,但现在我看到了一个全新的错误。enqueue中的错误是无法将代码项存储在blib/lib/Storable.pm(自动拆分为blib/lib/auto/Storable/_freeze.al)第339行的/home/threadsmodule/Thread-Queue-Any-1.14/lib//Thread/Queue/Any.pm行54I尝试了以下操作:my$ref=sub{print“hello”$wt_to_mt_queue->enqueue($ref)代码>并得到相同的错误。然而,这个模块似乎不打算存储代码引用,只存储数据结构。阅读文档。它至少帮助我解决了这个错误,但现在我看到了一个全新的错误。enqueue中的错误是无法将代码项存储在blib/lib/Storable.pm(自动拆分为blib/lib/auto/Storable/_freeze.al)第339行的/home/threadsmodule/Thread-Queue-Any-1.14/lib//Thread/Queue/Any.pm行54I尝试了以下操作:my$ref=sub{print“hello”$wt_to_mt_queue->enqueue($ref)代码>并得到相同的错误。然而,这个模块似乎不打算存储代码引用,只存储数据结构。阅读文档。