【问题标题】:Perl: how do I return undef into a list?Perl:如何将 undef 返回到列表中?
【发布时间】:2015-05-20 23:41:06
【问题描述】:

我在 Perl 中有一个小问题。基本上,我会这样做:

sub myFunction
{
    return (&myOtherFnA(),&myOtherFnB(),&myOtherFnC());
}
sub myOtherFnA() {return 'A';}
sub myOtherFnB() {return undef;}
sub myOtherFnC() {return 'C';}

我的问题是:当 myOtherFnB() 返回 undef 时,我想要一个将 undef 作为第二个元素的列表。但是当 myOtherFnB() 这样做时,我只得到一个包含 2 个元素的列表,即 myOtherFnA() 和 myOtherFnC() 的列表。我明白了:

('A','C')

但我想得到:

('A', undef, 'C')

如果 myOtherFnB() 是 undef 并且实际上只是将 undef 的一个元素放入列表中,我需要使用什么语法来阻止 Perl 从列表中删除返回的 myOtherFnB()?

【问题讨论】:

  • 如果我删除了子定义中的 & 符号(所以它可以编译),它会按照你说的那样工作。你能发布一些表现出这个问题的工作代码吗?
  • 是的,展示您在 myFunction 中实际构建列表的方式。您展示的内容按您想要的方式工作。
  • 请不要修复原始帖子中的问题:: 它使为帮助您而编写的解决方案毫无意义
  • 我只是修复了我自己的代码中不存在的语法错误,但在简短的示例中我概述了问题

标签: perl


【解决方案1】:

我不知道是什么让您认为您没有在列表中获得undef。但是,您的代码存在许多问题

  • 在定义子例程时不要使用 & 符号 & — 这是语法错误

  • 在调用子例程时不要使用 & 符号。自 20 多年前的 Perl 4 以来,这一直没有必要

  • 不要使用原型(定义中子例程名称后面的括号),因为它们不会按照您的想法做,而且它们是用于非常专业的东西

  • 不要在本地标识符中使用大写字母:它们是为包名等全局标识符保留的

此代码重写修复了语法错误并纠正了上述问题。如您所见,返回列表的第二个元素是undef

use strict;
use warnings;

sub my_function {
  return (
    my_other_function_a(),
    my_other_function_b(),
    my_other_function_c()
  );
}

sub my_other_function_a {
  return 'A';
}

sub my_other_function_b {
  return undef;
}

sub my_other_function_c {
  return 'C';
}


use Data::Dump;
dd [ my_function ];

输出

["A", undef, "C"]

【讨论】:

  • 您的最后一个要点(“不要在本地标识符中使用大写字母”)不像您的其他要点那样被广泛接受。这是本地编码风格问题;很多人使用 camelCase 函数名称。我自己做了。
  • @cjm:也许是这样,但这并不能使骆驼案成为一个好主意。它主要由具有 Java 或 Visual Basic 背景的程序员使用,而主要语言是 Perl 的程序员很少使用它。据我所知,没有推荐驼峰式大小写的 Perl 风格指南,perlstyle 指出 “通常$var_names_like_this$VarNamesLikeThis 更容易阅读,尤其是对于非英语母语人士而言”。 This blog post 是一个学习程序员对 Perl 命名约定的有用讨论。
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多