对此可能有一个简单的解决方案,但我无法弄清楚.我期待:
注意:它只是设置$variable为" N/A",我无法工作.
例如:
foreach $var (@list) {
($name,$date,$size, etc...)=split(/,\"/,$var);
}
Run Code Online (Sandbox Code Playgroud)
如果数组中的字段为空,我将如何设置$date为" N/A"?
所以产生:
$name = Jim
$date = N/A
$size = small
Run Code Online (Sandbox Code Playgroud)
我希望这很有意义并且易于修复.-谢谢
mar*_*cog 24
假设变量$date在"空"时未定义:
if (!defined($date)) {
$date = 'N/A';
}
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
$date //= 'N/A';
Run Code Online (Sandbox Code Playgroud)
或者,如果它真的是一个空字符串,即$date = '';(这也将在该情况下,工作$date是不确定的,但你不希望使用这个,如果你只是想确定的情况下它是未定义的):
if ($date eq '') {
$date = 'N/A';
}
Run Code Online (Sandbox Code Playgroud)
或者更简洁(注意,这也将设置$date到N/A,如果$date是'0'由于Perl的弱类型):
$date ||= 'N/A';
Run Code Online (Sandbox Code Playgroud)
至于你的第三个要点和实际问题:检查空虚:
对于空字符串,您可以执行上述操作eq "",也可以检查字符串长度:$var = "N/A" unless length($var);;
对于未定义的空字符串,在Perl 5.10中,您可以使用"defined-or"(//)运算符来执行短版本:$var = "N/A" unless length($var // '');
在5.10之前的Perl中,"defined-or"不可用,您将要么拼出定义的检查: $var = "N/A" unless defined $var && length($var);
...或者,你可以通过关闭它们来停止关注未定义的警告(h/t brian d foy):
no warnings 'uninitialized';
$_ = "N/A" unless length($_) foreach ($name,$date,$size, etc...);
use warnings 'uninitialized'; # Always turn back on.
Run Code Online (Sandbox Code Playgroud)但请注意,您还应该考虑对前两个要点采用不同的方法.实现自己的100%正确的CSV解析器并非易事 - 例如,如果任何字段包含双引号,您的示例代码将会中断.
相反,您应该始终使用标准Perl CSV解析器之一,例如Text::CSV_XS.