【问题标题】:Identify empty string in Perl在 Perl 中识别空字符串
【发布时间】:2011-05-28 06:30:54
【问题描述】:

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

  • 将 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

我希望这是有道理的,并且很容易解决。 -谢谢

【问题讨论】:

  • 如果缺少日期,输入会怎样?如果输入是:somename,200(其中 200 是大小),那么日期将设置为 200 对吗?
  • /,\"/ 闻起来很有趣。您的字段是否以引号开头而不以引号结尾?在split 调用之后,您是否从数据中删除了尾随引号?第一个字段不是以引号开头吗?

标签: perl string


【解决方案1】:

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

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

或者更简洁:

$date //= 'N/A';

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

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

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

$date ||= 'N/A';

【讨论】:

  • 这对我正在寻找的东西也很有帮助。谢谢你的回答。
  • 你也可以这样做:$date ||= 'N/A';
  • @Marcog - 如果值包含“0”,则“||=”是一个错误。 “日期”字段可能不是这种情况,但您仍应提及该警告
  • 只是一个注释,但 ||= 如果您的数据中有零,则可能无法执行您想要的操作。我的 $test = 0 || '不适用'; => $test 是“不适用”。也许 $test = defined($test) ? $test ne '' ? $test : 'N/A' : 'N/A';如果您只关心未定义的值并且拥有 5.10+ Perl,$test //= 'N/A';会做得很好。编辑:男孩,我是一个打字慢的人吗?
  • @Hugmeir 在我不知道的//= 中编辑。感谢@DVK,已经注意到0 位。
【解决方案2】:

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

如果输入是这样的 某个名字,,,200

其中 200 是大小,并且由于日期不可用,它被设置为空。然后你可以做一个简单的if-check:

if($date eq '')
{
  $date = "NA";
}

注意 $date 将被定义,它将被设置为空

【讨论】:

  • 这篇文章以及 proxon 的文章似乎主要是我要找的。我在定义它并且仍然输出空值时遇到问题。我只是尝试将它嵌入到我的代码中,它帮助我创建了所需的输出。
【解决方案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 ""))

确保您使用字符串比较来比较字符串:)

【讨论】:

  • 日期仍将被定义,如果输入的日期为空值
  • 如果不需要插值,您应该使用'' 而不是""
  • 好吧,这有点离题了,但是为什么呢?除了在 PBP 中,还有什么特别的理由使用 '' 而不是 ""?从我的两秒钟实验中,它们变成了相同的操作码。不管它值多少钱,我都使用 '',因为我喜欢它的外观(除非我能提供帮助,否则我不会使用像 q{} 这样愚蠢的东西)。
  • @Hugmeir "" 会插入转义字符,例如 \n\t\`, etc. while ''` 不会。 'hello\n 字面意思是 hello\n 而“hello\n”将是 hello<newline>
  • 不过,我是在空字符串的上下文中询问的。
【解决方案4】:
  1. 至于您的第三个要点和实际问题:检查空虚:

    • 对于空字符串,可以做上面提到的eq "",也可以查看字符串长度:$var = "N/A" unless length($var);

    • 1234563 >
  2. 在 5.10 之前的 Perl 中,“定义或”不可用,您要么必须拼出定义的检查:$var = "N/A" unless defined $var && length($var);

  3. ...或者,您可以通过关闭它们来停止关心未定义的警告(h/t brian d foy):

    no warnings 'uninitialized';
    $_ = "N/A" unless length($_) foreach ($name,$date,$size, etc...);
    use warnings 'uninitialized'; # Always turn back on.
    
  4. 但是,请注意,您还应该考虑对前两个要点采用不同的方法。实现您自己的 100% 正确的 CSV 解析器并非易事 - 例如,如果任何字段包含双引号,您的示例代码就会中断。

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

【讨论】:

【解决方案5】:
if ($date eq '') { print "STRING IS EMPTY\n" } else { Print "STRING IS NOT EMPTY\n";}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2011-04-15
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2016-10-24
    相关资源
    最近更新 更多