2016-03-14 35 views
2

我有一行用逗号分隔,我需要将其分成4个单独的变量。用上一个值填充剩余字段的简单算法

即像val1, val2, val3, val4线会导致以下4个变量:

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

现在我可以用这样的事情很容易得到这样的:

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

但是,如果inputline含有较少超过4个值,其余变量应包含最后一个可用值。

I.e.如果inputline是val1, val2,则变量应设置如下:

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

什么是优雅的方式来处理呢?

回答

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; 

一些字符串falsey值:

$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' 

如果您的porgram中的'''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' 
+0

感谢您的回答,不幸的是,这似乎并没有与我在这里运行的perl版本一起工作:'不能修改分区(/)中的分区(/)' – Subbeh

+0

我改变了'// = '用'|| =',它现在似乎在工作 – Subbeh

+0

'//'是针对perl的新版本。如果我记得正确,那么'5.14 +'。 '||'的作用几乎相同 - 它只是以不同的方式处理空字符串'''和'0'。 – Sobrique

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溶液所解释的,为了保持计算结果为假的数据,也可以是在应用程序(''0)环路线之上应改为

合法

随着V5.10或更高版本

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

对于早期版本

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

如果数据肯定不能为''0,或者如果确实需要更换这些数据,则只有这样才可以保留||

+0

谢谢,很好的解决方案 – Subbeh