用最后一个值填充剩余字段的简单算法

时间:2016-03-14 09:47:34

标签: perl

我用逗号分隔了一行,我需要将它分成4个单独的变量。

即。像val1, val2, val3, val4这样的行会产生以下4个变量:

var1 = val1
var2 = val2
var3 = val3
var4 = val4

现在我可以通过使用类似的东西轻松搞定:

($var1, $var2, $var3, $var4) = (split /,/, $inputLine);

但是,如果输入行包含少于4个值,则其余变量应包含最后一个可用值。

即。如果输入行是val1, val2,那么变量应该设置如下:

var1 = val1
var2 = val2
var3 = val2
var4 = val2

这会是一种优雅的方法吗?

2 个答案:

答案 0 :(得分:4)

//="defined or" operator

$var2 //= $var1;
$var3 //= $var2;
$var4 //= $var3;

如链接帖子中所述,如果您使用5.10之前的版本,则等效于:

$var2 = defined($var2) ? $var2 : $var1;
$var3 = defined($var3) ? $var3 : $var2;
$var4 = defined($var4) ? $var4 : $var3;

有些字符串是假的值:

$str = '';
if ($str) {
    print "true\n";
} else {
    print "false\n";
}
# prints 'false'

$str = '0';
if ($str) {
    print "true\n";
} else {
    print "false\n";
}
# prints 'false'

如果您的电子邮件中'''0'为“无效”值,则可以使用||=运算符。
如果仅覆盖undef,请使用上述两个版本中的一个。

$var2 ||= $var1; # $var2 will be overriden if $var2 is undef or '' or '0'
$var3 ||= $var2; # $var3 will be overriden if $var3 is undef or '' or '0'
$var4 ||= $var3; # $var4 will be overriden if $var4 is undef or '' or '0'

答案 1 :(得分:1)

需要一个准备步骤和一个额外的变量,然后它就是一个单行循环。

# my (@in, $tmp) = ($var1, $var2, $var3, $var4); # If it was split
my (@in, $tmp) = (split /,/, $inputLine);

for ($var1, $var2, $var3, $var4) {
    $tmp = $_ = shift @in || $tmp;
}

坏消息:$tmp留在身边。

更新LeGEC解决方案中所述,为了使评估的数据保持为false但在应用程序中可能是合法的(''0 )上面的循环线应改为

使用v5.10或更高版本

$tmp = $_ = shift @in // $tmp

对于早期版本

$tmp = $_ = (@in ? shift @in : $tmp)

如果数据肯定不能是''0,或者确实需要更换这些数据,那么只有||才能保留。