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]."";但它不起作用.
谢谢!
有两种方法可以做到这一点:
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)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |