如何在变量中使用0作为字符串而不是||中的布尔值操作

时间:2015-10-30 11:34:34

标签: arrays perl boolean

我有两个变量的比较操作来选择一个具有值(包括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]."";但它没有用。

谢谢!

3 个答案:

答案 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];

另外,让我指出你的例子中的一些错误:

  1. 逗号在数组定义中崩溃,使用undef添加 未定义的值。
  2. 标量上下文中的
  3. @ara返回数组中元素的数量, 不是最后一个索引。因此for循环超出范围@ara
  4. 您可以在$i循环内分配for
  5. 所以你的例子可能是这样的:

    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;