2016-03-14 68 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