我用逗号分隔了一行,我需要将它分成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
这会是一种优雅的方法吗?
答案 0 :(得分:4)
$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
,或者确实需要更换这些数据,那么只有||
才能保留。