使用Perl操作Raspberry Pi时出现问题

使用Perl操作Raspberry Pi时出现问题,perl,raspberry-pi,raspberry-pi3,Perl,Raspberry Pi,Raspberry Pi3,我正在尝试使用下面的perl代码来检测Raspberry Pi水分传感器上的水分,并在检测到水分时采取措施(发送电子邮件)。代码似乎成功地从传感器获得了准确的读数,但它使我的程序崩溃并出现错误: cleaned up, exiting... original error: Can't locate object method "tid" via package "threads" at /usr/share/perl/5.28/XSLoader.pm line 111. 这是我的密码: us

我正在尝试使用下面的perl代码来检测Raspberry Pi水分传感器上的水分,并在检测到水分时采取措施(发送电子邮件)。代码似乎成功地从传感器获得了准确的读数,但它使我的程序崩溃并出现错误:

cleaned up, exiting...

original error: Can't locate object method "tid" via package "threads" at /usr/share/perl/5.28/XSLoader.pm line 111.
这是我的密码:

use strict;
use warnings;
use RPi::DHT11;
use RPi::WiringPi;
use RPi::Const qw(:all);

my $pi = RPi::WiringPi->new;
my $pin = $pi->pin(21);
my $state = $pin->read;
$pi->cleanup;

if ($state == 0) {

    print "The sensor detected moisture.\n";
    # send an email
    my ($msg, $user, $pass) = build_message();

eval {

    print "Executing in eval.\n";

    my ($reply) = $msg->send('smtp','mail.rushlogistics.com',
                 AuthUser=>$user, AuthPass=>$pass);

    print "Reply was: " . $reply . "\n"; # only prints here if there was no problems

    };


} else {

    print "The sensor is dry.\n";


    }
在检查传感器工作正常之前,先发送代码中的消息。评论my($reply)=$msg->send行也可以。我没有收到任何错误(当然也没有发送任何消息)

如果我添加
使用线程我收到以下错误:

The sensor detected moisture.
Executing in eval.
MIME::Lite::SMTP>>> MIME::Lite::SMTP
MIME::Lite::SMTP>>>   Net::SMTP(3.11)
MIME::Lite::SMTP>>>     Net::Cmd(3.11)
MIME::Lite::SMTP>>>       Exporter(5.73)
MIME::Lite::SMTP>>>     IO::Socket::IP(0.39)
MIME::Lite::SMTP>>>       IO::Socket(1.39)
MIME::Lite::SMTP>>>         IO::Handle(1.39)
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 220 mail42c28.carrierzone.com ESMTP Bigfoot 1.0; Fri, 15 May 2020 21:37:11 +0000
MIME::Lite::SMTP=GLOB(0x24b01f8)>>> EHLO localhost.localdomain
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-mail42c28.carrierzone.com Hello 63-151-32-226.dia.static.qwest.net [63.151.32.226], pleased to meet you
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-ENHANCEDSTATUSCODES
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-8BITMIME
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-SIZE 52428800
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-DSN
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-AUTH LOGIN CRAM-MD5
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-STARTTLS
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-DELIVERBY
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250 HELP

cleaned up, exiting...

original error: SMTP auth() command failed: Invalid argument
mail42c28.carrierzone.com Hello 63-151-32-226.dia.static.qwest.net [63.151.32.226], pleased to meet you
ENHANCEDSTATUSCODES
8BITMIME
SIZE 52428800
DSN
AUTH LOGIN CRAM-MD5
STARTTLS
DELIVERBY
HELP
传感器检测到湿气。
在eval中执行。
MIME::Lite::SMTP>>>MIME::Lite::SMTP
MIME::Lite::SMTP>>>Net::SMTP(3.11)
MIME::Lite::SMTP>>>Net::Cmd(3.11)
MIME::Lite::SMTP>>>导出程序(5.73)
MIME::Lite::SMTP>>>IO::Socket::IP(0.39)
MIME::Lite::SMTP>>>IO::Socket(1.39)
MIME::Lite::SMTP>>>IO::Handle(1.39)
MIME::Lite::SMTP=GLOB(0x24b01f8)>EHLO localhost.localdomain

MIME::Lite::SMTP=GLOB(0x24b01f8)您是如何安装/构建
perl
二进制文件的?它支持线程吗?你能检查一下你的
perl
是否支持线程:
perl-MConfig-E'say($Config{useithreads}?“ok”):“not ok”)”
如果输出是“not ok”,那么它就不支持threadsOk,很好。输出
已清理,正在退出…
从何而来?我没有使用Raspberry PI,因此无法测试程序中的模块。如果您可以确定脚本中的哪一行生成错误消息,这将非常有用。尝试在每行后面添加
print
语句,例如确定错误发生的位置通过编辑问题而不是将这些详细信息放在注释中来澄清问题。您是如何安装/构建
perl
二进制文件的?它支持线程吗?你能检查一下你的
perl
是否支持线程:
perl-MConfig-E'say($Config{useithreads}?“ok”):“not ok”)”
如果输出是“not ok”,那么它就不支持threadsOk,很好。输出
已清理,正在退出…
从何而来?我没有使用Raspberry PI,因此无法测试程序中的模块。如果您可以确定脚本中的哪一行生成错误消息,这将非常有用。尝试在每行后面添加
print
语句,例如,确定错误发生的位置通过编辑问题而不是将这些细节放在注释中来澄清问题。