微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么此陈述返回true

如何解决为什么此陈述返回true

|| 为什么这样说
    if (! $ssh_options{user}) {

    delete $ssh_options{user};

}
返回true,但是此语句
    if ($ssh_options{user} eq \'undef\') {

    delete $ssh_options{user};

}
给我错误
Use of uninitialized value $ssh_options{\"user\"} in string eq at analyze.pl line 230.
我认为您总是需要perl来比较要比较的变量的值。 **更新** @快速乔·史密斯 我无法根据哈希键是否存在进行比较,因为该哈希值
sub ssh_connect {

my $host = shift;

my %ssh_options = (

    port => shift,user => shift,password => shift

    );
来自这个调用子程序的函数
        if ((exists $config_file{user}) && (exists $config_file{password})) {

        my $vmware_user = $config_file{user};

        my $vmware_password = $config_file{password};

        ssh_connect($vmware_host,$vmware_port,$vmware_user,$vmware_password);

    } else {

        ssh_connect($vmware_host,$vmware_port);

    }
    

解决方法

Perl哈希槽有许多种可能为假的方式。如果从未填充过键,则
exists
函数将返回false。如果键存在但包含未定义的值,则
exists
为true,但
defined
函数将返回false。在正常的布尔上下文中,如
if
语句所给出的那样,从未填充或未定义的哈希键,
\'\'
,ѭ10reduces或任何可简化为该值的哈希键将为假。 在您的更新中,听起来像您想要使用
defined
delete $ssh_options{user} unless defined $ssh_options{user};
    ,用
exists
检查哈希键。
if (exists $ssh_options{user}) {
    ...
}
但是,在您的情况下,似乎您正在检查其值可能未定义的现有键,在这种情况下:
if (defined $ssh_options{user}) {
    ...
}
以上可能是您想要的。 作为旁注,请检查是否以您描述的方式定义了任何变量的值:
if ($something eq \'undef\') {
    ...
}
是错的。您正在检查变量是否包含字符串“ undef”。在这些情况下,您需要的是:
unless (defined $something) {
    ...
}
    ,但是如果
$ssh_options{\"user\"}
未初始化,则它没有可比较的值。     ,使用Perl,在布尔上下文中undefined的值为false。因此,您的第一个测试会按预期运行。但是,如果您不希望将零或空字符串保存为
$ssh_options{user}
的合法值,则可能会引入错误,如果您不希望将其视为undef。那是因为您的第一个测试不会区分false作为值和false作为未定义。就Perl的布尔值运算而言,所有以下各项均为\“ false \”:
0
\'\'
(空字符串),
undef
或空列表。 您的第二段代码失败,因为
undef
应该是一个裸字,而不是带引号的字符串。 \'undef \'作为带引号的字符串是一个值,在布尔测试中,该值实际上将为\'true \'。因为您正在将实际值与哈希元素进行比较,所以Perl警告您正在将某些内容与未定义的值进行比较。在这种情况下,不确定值是
$ssh_options{user}
。 Perl警告您实际上很好;它为您提供了有关您做错了什么的线索。 如果您确实要测试是否定义了$ ssh_options {user},请使用define()函数。如果要测试$ ssh_options {user}是否存在,请使用exist()函数。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。