识别Perl中的空字符串

时间:2010-12-20 13:41:46

标签: perl string

这可能是一个简单的解决方案,但我无法弄清楚。我期待:

  • 将CSV文件转换为数组
  • 遍历数组并将字段拆分为变量
  • 如果数组字段为空,则将变量设置为“N / A”

注意:我们只能将$variable设置为“N/A”我无法正常工作。

例如:

foreach $var (@list) {

($name,$date,$size, etc...)=split(/,\"/,$var);

}

如果数组中的字段为空,我如何将$date设置为“N/A”?

所以要产生:

$name = Jim
$date = N/A
$size = small

我希望这很有意义并且很容易修复。 -Thanks

5 个答案:

答案 0 :(得分:24)

假设变量$date在“空”时未定义:

if (!defined($date)) {
  $date = 'N/A';
}

或者更简洁:

$date //= 'N/A';

或者它是否真的是一个空字符串,即$date = '';(这也适用于$date未定义的情况,但如果仅,则不想使用此字符串想要识别未定义的情况):

if ($date eq '') {
  $date = 'N/A';
}

或者更简洁(请注意,如果由于Perl的弱键入,$dateN/A,这也会将$date设置为'0'

$date ||= 'N/A';

答案 1 :(得分:6)

  1. 至于你的第三个要点和实际问题:检查空虚:

    • 对于空字符串,您可以执行上述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);
  2. 但请注意,您还应该考虑对前两个要点采用不同的方法。实现自己的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";}

我们可以使用上面的代码来识别空字符串,并且使用正则表达式更有效。 “=〜”运算符和使用正则表达式也可以解决这个问题。