这可能是一个简单的解决方案,但我无法弄清楚。我期待:
注意:我们只能将$variable
设置为“N/A
”我无法正常工作。
例如:
foreach $var (@list) {
($name,$date,$size, etc...)=split(/,\"/,$var);
}
如果数组中的字段为空,我如何将$date
设置为“N/A
”?
所以要产生:
$name = Jim
$date = N/A
$size = small
我希望这很有意义并且很容易修复。 -Thanks
答案 0 :(得分:24)
假设变量$date
在“空”时未定义:
if (!defined($date)) {
$date = 'N/A';
}
或者更简洁:
$date //= 'N/A';
或者它是否真的是一个空字符串,即$date = '';
(这也适用于$date
未定义的情况,但如果仅,则不想使用此字符串想要识别未定义的情况):
if ($date eq '') {
$date = 'N/A';
}
或者更简洁(请注意,如果由于Perl的弱键入,$date
为N/A
,这也会将$date
设置为'0'
:
$date ||= 'N/A';
答案 1 :(得分:6)
至于你的第三个要点和实际问题:检查空虚:
对于空字符串,您可以执行上述eq ""
,也可以检查字符串长度:$var = "N/A" unless length($var);
;
对于未定义的空字符串,Perl 5.10中的 ,您可以使用“defined-or”(//
)运算符来执行短版本:{{1} }
在5.10之前的Perl中,“defined-or”不可用,您必须拼出定义的支票:$var = "N/A" unless length($var // '');
...或者,您可以通过关闭它们来停止关注未定义的警告(h / t brian d foy):
$var = "N/A" unless defined $var && length($var);
但请注意,您还应该考虑对前两个要点采用不同的方法。实现自己的100%正确的CSV解析器并非易事 - 例如,如果任何字段包含双引号,您的示例代码将会中断。
相反,您应该始终使用标准Perl CSV解析器之一,例如no warnings 'uninitialized';
$_ = "N/A" unless length($_) foreach ($name,$date,$size, etc...);
use warnings 'uninitialized'; # Always turn back on.
。
答案 2 :(得分:3)
$name = "N/A" if (!defined($name) || ($name eq ""))
$date = "N/A" if (!defined($date) || ($date eq ""))
$size = "N/A" if (!defined($size) || ($size eq ""))
确保使用字符串比较来比较字符串:)
答案 3 :(得分:2)
如果缺少日期,输入会是什么?如果输入是:somename,200(其中200是大小),那么date会被设置为200吗?
如果输入是这样的 somename ,, 200
其中200是大小,并且由于日期不可用,因此将其设置为空。然后你可以做一个简单的if-check:
if($date eq '')
{
$date = "NA";
}
注意$ date将被定义,它将被设置为空
答案 4 :(得分:1)
if ($date eq '') { print "STRING IS EMPTY\n" } else { Print "STRING IS NOT EMPTY\n";}
我们可以使用上面的代码来识别空字符串,并且使用正则表达式更有效。 “=〜”运算符和使用正则表达式也可以解决这个问题。