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

Ars*_*nii 1 arrays perl boolean

我有两个变量的比较操作来选择一个有一个值(包括0)的变量.该脚本必须找到两个变量中的哪一个具有任何值,哪个不具有任何值.

以下是一个例子:

    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;
Run Code Online (Sandbox Code Playgroud)

输出必须是: 013345

但是,Perl中认为从第一元件@ara(这是0),为Nill(无).并认为该元素根本没有任何价值.而我的实际输出是:113345.

问题是:如何" 在运行中 "我可以将那些0s从布尔值转换为字符串?

我知道,我可以提出@ara如下:

@ara = ('0', '1', '2'..);
Run Code Online (Sandbox Code Playgroud)

但由于整个剧本中的某些条件,我不能这样做.我唯一能做的就是将确切的单独元素转换为所需的格式(如:)doSomething($ara[$i]).我也尝试过:$ara[$i]."";但它不起作用.

谢谢!

Sob*_*que 7

有两种方法可以做到这一点:

defined 如果定义了变量,则返回true.

还是//运营商,这和Perl的5.10可以让你做的东西非常相似,以||从分开0''这通常被认为是"假".

但是你没有必要做任何事情来'转换',因为perl会自动执行 - 如果你正在做一些0字符串的事情,它会把它当成一个字符串,而如果你做的"0"是数字,它就会把它视为一个数值.

你可以:

 $output .= $ara[$i] // $arb[$i];
Run Code Online (Sandbox Code Playgroud)

要么:

 $output .=  defined $ara[$i] ?  $ara[$i] : $arb[$i];
Run Code Online (Sandbox Code Playgroud)

你必须在旧版本的perl上使用后者,//而不是可用的.

请注意 - 你的for循环中有一个fencepost错误.您应该使用:

for (0..$#ara) {
Run Code Online (Sandbox Code Playgroud)

因为@ara在标量上下文返回元素(数量5) -但你indicies是0... 4.

您还应该注意:

my @ara = (0,1,,3,4,5);
Run Code Online (Sandbox Code Playgroud)

不做你认为它做的事情 - 双逗号不是空值,它只是被忽略了.

use Data::Dumper;
print Dumper \@ara;
Run Code Online (Sandbox Code Playgroud)

得到:

$VAR1 = [
          0,
          1,
          3,
          4,
          5
        ];
Run Code Online (Sandbox Code Playgroud)

也许你的意思更像是:

#!/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;
Run Code Online (Sandbox Code Playgroud)