【问题标题】:Can't use an undefined value as a symbol reference不能使用未定义的值作为符号引用
【发布时间】:2012-01-28 08:22:36
【问题描述】:

我正在尝试将 API 用于 Palo Alto Networks 软件。该代码应该将用户网络登录的用户名和 IP 地址提交到 Web 界面。

当我尝试将 PAN 的 API 及其示例代码用于 Windows 机器时,会引发以下异常:

Can't use an undefined value as a symbol reference at
C:/Perl/lib/PAN/API.pm line 179 (#1)

PAN::API::UID::login('PAN::API::UID=HASH(0x7fd113828598)', 'SCU-DSM22/pmmertens', 172.16.6.117) called at API_events.pl line 12

这是 API 文档附带的代码示例:

#!/usr/bin/perl -w

use strict;
use PAN::API;

my     $useridagent    = '10.0.0.99'; #I changed this to our PAN server address

my     $useridapi      = PAN::API::UID->new($useridagent);

my     $user           = $ENV{USERDOMAIN}.'/'.$ENV{USERNAME};
my     $ipaddress      = unpack('W4',gethostbyname($ENV{COMPUTERNAME}));

    $useridapi->login($user,$ipaddress);

我已确保正确检索所有变量。替换文字值也无济于事。谷歌搜索这个错误会找到关于硬引用和软引用的引用,但我在下面的代码中没有看到任何违反这些规则的行为。

这是来自 PAN/Api.pm 的代码块。第 179 行是打印开始的地方。

sub submit () {
    my  $self               = shift;

    use IO::Socket::INET;
    use IO::Socket::SSL;

    my  $socket             = IO::Socket::INET->new(PeerAddr => $self->{server},
                                                PeerPort => $self->{port},
                                                Proto    => 'tcp');

    my  $socketssl          = IO::Socket::SSL->start_SSL(   $socket,
                                                    SSL_version     =>'TLSv1');
    print   $socketssl $self->xml;
            $socketssl->close;
            $socketssl->stop_SSL;
}

【问题讨论】:

  • 就在print 语句之前,添加die "\$socketssl not defined" unless defined $socketssl; 看看它是否死在那里。
  • 发生完全相同的错误。我有什么办法可以确保与服务器建立 SSL 连接?如果我输入错误的服务器 IP,它甚至会给我这个错误
  • 这种情况下还要加上die "xml method not defined" unless defined $self->xml;
  • 我在错误的地方编辑 API.pm。现在死 "\$socketssl not defined..." 给我 $socketssl not defined at /opt/local/lib/perl5/5.12.3/PAN/API.pm line 180. at /opt/local/lib/perl5/ 5.12.3/PAN/API.pm 第 180 行
  • PAN::API 不进行错误检查,将其报告为其中的错误。

标签: perl api


【解决方案1】:

IO::Socket::INET 和 IO::Socket::SSL 行都应该有错误检查。比如:

my $socket = IO::Socket::INET->new(....)
  or die "Failed to create socket: $!"

还有:

my $socketssl = IO::Socket::SSL->start_SSL(...)
  or die "Failed to start SSL: ".IO::Socket::SSL::errstr();

虽然我可能会选择 Carp::confess,而不是死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多