识别Perl中的空字符串

Nat*_*oob 14 string perl

对此可能有一个简单的解决方案,但我无法弄清楚.我期待:

  • 将CSV文件放入数组中
  • 循环遍历数组并将字段拆分为变量
  • 如果数组字段为空,则将变量设置为"N/A"

注意:它只是设置$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)

或者更简洁(注意,这也将设置$dateN/A,如果$date'0'由于Perl的弱类型):

$date ||= 'N/A';
Run Code Online (Sandbox Code Playgroud)

  • @Marcog - 如果值包含"0",则"|| ="是一个错误.可能不是"日期"字段的情况,但你仍然应该提到这个警告 (3认同)
  • 你也可以这样做:`$ date || ='N/A';` (2认同)

DVK*_*DVK 6

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

    • 对于空字符串,您可以执行上述操作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)
  2. 但请注意,您还应该考虑对前两个要点采用不同的方法.实现自己的100%正确的CSV解析器并非易事 - 例如,如果任何字段包含双引号,您的示例代码将会中断.

    相反,您应该始终使用标准Perl CSV解析器之一,例如Text::CSV_XS.