我遇到了使用undef让三元运算符工作的问题。 我的原始代码有效:
my $qr = [
{IP=>'x.x.x.51',Testnet=>'bos-portal-legacy',Owner=>'Amund', Email => 'bosemail'},
{IP=>'x.x.x.52',Testnet=>'bos-portal-2',Owner=>'Amund', Email => 'boemail2'},
{IP=>'x.x.x.53',Testnet=>'bos-portal-legacy',Owner=>'Amund', Email => 'bosemail'},
{IP=>'x.x.x.54',Testnet=>'sqa',Owner=>'Richard', Email => 'sqaemail'},
{IP=>'x.x.x.55',Testnet=>'sqa',Owner=>'Richard', Email => 'sqaemail'},
{IP=>'x.x.x.56',Testnet=>'fll-pro',Owner=>'Larry', Email => 'fllemail'},
{IP=>'x.x.x.57',Testnet=>'fll-pro', Owner=>'', Email => 'fllemail'},
{IP=>'x.x.x.58',Testnet=>'fll-pro2', Owner=>'', Email => 'flemail2'},
];
my $len = scalar @$qr;
print "Starting of array: $len\n";
my $l = $len;
my $a = @$qr[0]->{Owner};
func ($a);
my @ip;
my %test;
my $name;
my $manager;
my $ip_ref;
my $test_ref;
sub func{
foreach my $emp (@$qr) {
if ($l > 1 && $emp->{Owner} eq $a) {
$name = $emp->{Owner}; #to use with email as $a will change as cycle thru
$manager = $emp->{Manager};
push (@ip, $emp->{IP}); #capture all IPs related to owner $name
$test{$emp->{Testnet}} = $emp->{Email}; #capture unique testnets only related to owner $name
$l--; #to cycle thru array until reach last row
print "Finished line: $l\n";
}
我也有一些其他的东西,但并不想让这一切陷入困境。一切正常,如果在我的哈希中未定义所有者,那么当它打印时,它是预期的空白点。所以它打印如下:
Starting of array: 8
Finished line: 7
Finished line: 6
Finished line: 5
Amund
x.x.x.51, x.x.x.52, x.x.x.53
bos-portal-2
bos-portal-legacy
Finished with Amund
Moving on to Richard: 4
Finished line: 3
Richard
x.x.x.54, x.x.x.55
sqa
Finished with Richard
Moving on to Larry: 2
Larry
x.x.x.56
fll-pro
Finished with Larry
Moving on to : 1
#Blank Spot want to have $name printed as 'Undef' instead
x.x.x.57, x.x.x.58
fll-pro
fll-pro2
我想现在这样做,以便$ name是$ emp-> {Owner},除非所有者未定义,而不是空白点,它会说'Undef。'因此,我想将我的代码的所有部分更改为$ name = $ emp-> {Owner}进行三元操作。
我尝试过使用undef的许多不同用法,因为这就是错误所说的。一些类似的帖子讨论了我尝试的定义或用法,以及其他声明使用定义的帖子,但如果我这样做,那么所有的名字都会成为' Undef'而不只是空白的。其中一些什么都不做,我仍然得到空白。其他人给出了$ a现在未初始化的错误。
$a = undef ? $name = 'Undefined' : $name = $emp->{Owner};
($a = undef) ? $name = 'Undefined' : $name = $emp->{Owner};
$a = undef($a) ? $name = 'Undefined' : $name = $emp->{Owner};
$name = undef($a) ? 'Undefined' : $emp->{Owner};
$name = $emp->{Owner} // 'Undefined';
defined($a) ? $name = $emp->{Owner} : $name = 'Undef';
$name = defined($a) ? $emp->{Owner} : 'Undef';
非常感谢任何帮助。谢谢。
答案 0 :(得分:6)
Owner=>''
空未定义,所以
$name = defined($a) ? $emp->{Owner} : 'Undef';
将始终返回$emp->{Owner}
个内容,即使该内容为空。然而
$name = $a ? $emp->{Owner} : 'Undef';
将替换' Undef'如果$a
为空,则$emp->{Owner}
为空,因为$a
已定义,但为空,即“假”'
upd:有一种更丑陋的三元运算符形式。它应该只用于娱乐,因为它使代码的可读性相当低:
$name = $a && $emp->{Owner} || 'Undef';
答案 1 :(得分:4)
你想要的答案是:
$name = $emp->{Owner} || 'No name provided';
如果$emp->{Owner}
不是假值(例如:undefined,zero,空字符串......),那么它将被分配。否则,Perl将分配运营商右侧的任何内容。
另外,我要补充说undef
是一个将参数更改为未定义值并始终返回未定义值的函数。例如,一个非常常见的错误是做这样的事情:
if (undef $var) {
# do something
}
如果$var
未定义,则不测试。相反,它使$var
未定义,然后测试表达式---这将是假的,因此永远不会执行此if
块。
这就是为什么建议使用defined
:
if (!defined $var) {
# do something
}
这将测试$var
而不更改它。
然而,正如其他人所指出的那样,你的变量开始时并没有真正定义。
答案 2 :(得分:1)
您需要测试defined
,而不是undef
。
假设$a
为undef
,您的上一个示例应该有效:
$name = defined($a) ? $emp->{Owner} : 'Undef';
但是,也许你需要测试一个空字符串。 undef
与空字符串不同;如果你想对两者采取相同的行动,你需要明确地测试每个条件。