我有两个变量的比较操作来选择一个具有值(包括0)的变量。该脚本必须找到两个vars中的哪一个有任何值,哪些没有。
以下是一个例子:
my @ara = (0,1,,3,4,5);
my @arb = (1,,3,4,,);
my $output;
my $i = 0;
for (0..@ara) {
$output .= $ara[$i] || $arb[$i]; # a non-empty value has to be added to the $output.
$i++;
}
print $output;
输出必须是:013345
但是,Perl将@ara
中的第一个元素(0
)视为 Nill (无)。并且认为该元素具有 no 值。我的实际输出是:113345
。
问题是:如何" 动态"我可以将0
s从布尔值转换为字符串吗?
我知道,我可以提供我的@ara
,如下所示:
@ara = ('0', '1', '2'..);
但由于整个剧本中的某些条件,我不能这样做。
我唯一能做的就是将确切的单独元素转换为所需的格式(例如:doSomething($ara[$i])
)。
我也尝试过:$ara[$i]."";
但它没有用。
谢谢!
答案 0 :(得分:7)
有两种方法可以做到这一点:
defined
如果定义了变量,则返回true。
或//
运算符,从{5.1}开始,除||
和0
之外,它允许您对''
执行非常相似的操作通常会被视为“错误”。
但你不必做任何事情来转换'因为perl会自动执行此操作 - 如果您正在执行字符串操作,则会将0
视为字符串,如果您正在执行数字操作,则会将"0"
视为数值。
你可以:
$output .= $ara[$i] // $arb[$i];
或者:
$output .= defined $ara[$i] ? $ara[$i] : $arb[$i];
您必须在//
不可用的旧版perl上使用后者。
请注意 - 你的for循环中有一个fencepost错误。您应该使用:
for (0..$#ara) {
因为标量上下文中的@ara
会返回元素数量(5
) - 但您的指标是0
.. 4
。
您还应该注意:
my @ara = (0,1,,3,4,5);
没有做你认为它做的事情 - 双逗号不是空值,它只是被忽略了。
use Data::Dumper;
print Dumper \@ara;
给出:
$VAR1 = [
0,
1,
3,
4,
5
];
也许你的意思更像是:
#!/usr/bin/env perl
use strict;
use warnings;
my @ara = ( 0, 1, undef, 3, 4, 5 );
my @arb = ( 1, undef, 3, 4, undef, );
my $output;
for my $index ( 0 .. $#ara ) {
# a non-empty value has to be added to the $output.
$output .= $ara[$index] // $arb[$index];
}
print $output;
答案 1 :(得分:3)
看起来您需要 defined-或运算符,该运算符自Perl v5.10起可用
如果$x || $y
为真,则 $x
评估为$x
,否则为$y
$x // $y
如果<{1}} 定义,$x
评估为$x
的方式相同,否则为$y
此声明将修复您的程序
$output .= $ara[$i] // $arb[$i]
但你也应该注意人们提出的其他问题。特别是,必须始终
use strict;
use warnings 'all';
在你编写的每个 Perl程序的开头。这将会发现你可能忽略的相对简单的错误
答案 2 :(得分:0)
对于Perl 5.10或更高版本,您可以使用logical Defined-Or运算符//
代替||
。
$output .= $ara[$i] // $arb[$i];
对于5.10下的Perl,您可以使用the conditional operator ?:
$output .= defined $ara[$i] ? $ara[$i] : $arb[$i];
另外,让我指出你的例子中的一些错误:
undef
添加
未定义的值。@ara
返回数组中元素的数量,
不是最后一个索引。因此for
循环超出范围@ara
。$i
循环内分配for
。所以你的例子可能是这样的:
my @ara = (0,1,undef,3,4,5);
my @arb = (1,undef,3,4,undef,undef);
my $output;
for my $i (0..$#ara) {
$output .= $ara[$i] // $arb[$i];
}
print $output;