Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别Perl中的空字符串_Perl_String - Fatal编程技术网

识别Perl中的空字符串

识别Perl中的空字符串,perl,string,Perl,String,也许有一个简单的解决办法,但我想不出来。我希望: 将CSV文件放入数组中 循环遍历数组并将字段拆分为变量 如果数组字段为空,则将变量设置为“N/A” 注意:仅将$变量设置为“N/A”,我无法工作。 例如: foreach $var (@list) { ($name,$date,$size, etc...)=split(/,\"/,$var); } 如果数组中的字段为空,如何将$date设置为“N/A 因此,要产生: $name = Jim $date = N/A $size = sma

也许有一个简单的解决办法,但我想不出来。我希望:

  • 将CSV文件放入数组中
  • 循环遍历数组并将字段拆分为变量
  • 如果数组字段为空,则将变量设置为“N/A”
注意:仅将
$变量设置为“
N/A
”,我无法工作。

例如:

foreach $var (@list) {

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

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

因此,要产生:

$name = Jim
$date = N/A
$size = small
我希望这是有意义的,很容易修复。
-谢谢

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

或者更简洁地说:

$date //= 'N/A';
或者如果它确实是一个空字符串,即
$date=''(这在
$date
未定义的情况下也适用,但如果您只想标识未定义的情况,则不希望使用此选项):

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


如果缺少日期,输入会是什么样子?如果输入是:somename,200(其中200是大小),那么日期将设置为200,对吗

如果输入是这样的 某某,200

其中200为大小,由于日期不可用,因此将其设置为空。然后,您可以执行一个简单的if检查:

if($date eq '')
{
  $date = "NA";
}
注意$date将被定义,它将被设置为空

$name = "N/A" if (!defined($name) || ($name eq ""))
$date = "N/A" if (!defined($date) || ($date eq ""))
$size = "N/A" if (!defined($size) || ($size eq ""))
确保使用字符串比较来比较字符串:)

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

    • 对于空字符串,您可以执行上述
      eq”“
      ,也可以检查字符串长度:
      $var=“N/A”,除非长度($var)

    • 对于未定义的空字符串,在Perl 5.10中,可以使用“defined or”(
      /
      )操作符执行简短版本:
      $var=“N/A”,除非长度($var/”)

    • 在Perl 5.10之前的版本中,如果“defined or”不可用,则必须拼写定义的检查:
      $var=“N/A”,除非定义了$var&&length($var)

    • 。。。或者,您可以通过关闭未定义的警告(h/t brian d foy)来停止关注这些警告:

  • 请注意,你也应该考虑前两个要点不同的方法。实现自己的100%正确的CSV解析器并非易事——例如,如果任何字段包含双引号,示例代码将中断

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


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

    如果缺少日期,输入会是什么样子?如果输入为:somename,200(其中200是大小),则日期将设置为200,对吗\“/
    闻起来很怪。字段是否以引号开头而不是以引号结尾?在
    split
    调用之后,您是否从数据中剥离尾随引号?第一个字段不是以引号开头吗?日期仍将被定义,如果输入的日期值为空,则应使用
    '
    ,如果不需要插值,则不应使用
    '
    。好的,这有点离题,但为什么?除了在PBP中,还有什么特别的原因使用“”而不是“”?从我两秒钟的实验中,它们变成了相同的操作码。不管它值多少钱,我都会使用“”,因为我喜欢它的外观(除非我能帮上忙,否则我不会使用像q{}这样愚蠢的东西)。@Hugmeir
    插入转义字符,如
    \n
    \t
    \`,而
    `不会
    'hello\n
    将字面上是
    hello\n
    ,而“hello\n”将是
    hello
    。不过,我是在空字符串的上下文中提问的。这篇文章以及proxon的文章似乎主要是我要找的。我在定义它时遇到了问题,仍然输出空值。我只是试着将它嵌入到我的代码中,它帮助我创建了所需的输出。这对我所寻找的东西也很有帮助。谢谢你的回答。你也可以这样做:
    $date | |='N/A'
    @Marcog-如果值包含“0”,则“| |=”是一个bug。“date”字段的情况可能不是这样,但是您仍然应该提到,Caveat只是一个注释,但是如果数据中有零,则| |=可能不会执行您想要的操作。我的$test=0 | |“不适用”;=>$测试结果为“不适用”。也许$test=定义的($test)$测试网元“”$测试:“不适用”:“不适用”;如果您只关心未定义的值,并且有一个5.10+Perl,$test/='N/a';就行了。编辑:孩子,我打字太慢了。@Hugmeir在我不知道的
    /=
    中编辑。由于@DVK.++for//和Text::CSV,已经注意到
    0
    位。//的相关perldoc链接:
    $date ||= 'N/A';
    
    if($date eq '')
    {
      $date = "NA";
    }
    
    $name = "N/A" if (!defined($name) || ($name eq ""))
    $date = "N/A" if (!defined($date) || ($date eq ""))
    $size = "N/A" if (!defined($size) || ($size eq ""))
    
    no warnings 'uninitialized';
    $_ = "N/A" unless length($_) foreach ($name,$date,$size, etc...);
    use warnings 'uninitialized'; # Always turn back on.
    
    if ($date eq '') { print "STRING IS EMPTY\n" } else { Print "STRING IS NOT EMPTY\n";}