如何解决为什么此陈述返回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 举报,一经查实,本站将立刻删除。