【问题标题】:Why can't I set $LIST_SEPARATOR in Perl?为什么我不能在 Perl 中设置 $LIST_SEPARATOR?
【发布时间】:2010-10-17 05:00:40
【问题描述】:

我想在 perl 中设置 LIST_SEPARATOR,但我得到的只是这个警告:

Name "main::LIST_SEPARATOR" used only once: possible typo at ldapflip.pl line 7.

这是我的程序:

#!/usr/bin/perl -w

@vals;
push @vals, "a";
push @vals, "b";

$LIST_SEPARATOR='|';

print "@vals\n";

我确定我遗漏了一些明显的东西,但我没有看到它。

谢谢

【问题讨论】:

  • 如果你有'use strict;'在您的代码顶部,您会得到公认的略显神秘的“全局符号“$LIST_SEPARATOR”需要显式包名”错误(不是警告),这是 Perl 表示尚未声明变量的方式。
  • 不使用 strict 就像先将一个锯断的霰弹枪枪管粘在你的额头上,然后让随机的路人为你扣动扳机。
  • 通常最好使用警告编译指示而不是“-w”。在这里可能并不重要,但我想我会提到它。

标签: perl list-separator


【解决方案1】:

只有助记符可用

$" = '|';

除非你

use English;

首先。

perlvar 中所述。请阅读文档。

以下名称对 Perl 具有特殊含义。大多数标点名称都有合理的助记符,或在外壳中的类似物。不过,如果你想使用长变量名,你只需要说

use English;

在程序的顶部。这会将所有短名称别名为当前包中的长名称。有些甚至有中名,通常是从 awk 借来的。一般来说,最好使用

use English '-no_match_vars';

如果您不需要 $PREMATCH、$MATCH 或 $POSTMATCH 则调用,因为它避免了使用正则表达式对性能造成的影响。见English

【讨论】:

    【解决方案2】:

    perlvar是你的朋友:

    $LIST_SEPARATOR
    $"

    这类似于$,,只是它适用于插入双引号字符串(或类似的解释字符串)的数组和切片值。默认为空格。 (助记符:我认为很明显。)

    $LIST_SEPARATOR 仅适用于 use English; 如果您不想在所有程序中使用 use English;,请改用 $"。相同的变量,只是名称更简洁。

    【讨论】:

    • 必须爱上它。一个变量,有两个名字,只有一个有效。 :-S。感谢您的帮助
    • 它们都有效。第二个名称仅在您要求时才使用,以防止不必要的命名空间堵塞。
    • 另外,您可能想要“使用英语 qw( -no_match_vars );”以避免性能问题(除非您出于某种原因需要 $PREMATCH、$MATCH 或 $POSTMATCH)。
    【解决方案3】:

    有点跑题了(这个问题已经很好回答了),但我没有得到English的吸引力。

    缺点:

    • 更多的输入
    • 名称不太明显(即,我仍然必须查一下)

    优点:

    • ?

    我可以看到 其他 读者的好处——尤其是那些根本不了解 Perl 的人。但在这种情况下,如果是以后让代码更具可读性的问题,我宁愿这样:

    {
      local $" = '|'; # Set interpolated list separator to '|'
      # fun stuff here...
    }
    

    【讨论】:

    • 谢谢 - 当我的帖子只完成一半时,我不小心点击了返回。所以我希望它现在更有意义。
    【解决方案4】:

    你应该使用严格的编译指示:

    use strict;
    

    您可能希望使用诊断杂注来获取有关警告的更多命中(您已经使用 -w 标志启用):

    use diagnostics;
    

    【讨论】:

    • 我想知道的事情 - 在 ActivePerl 或其他基于 Windows 的 Perl(不包括 Cygwin)中,它是否主动在 #!/usr/bin/perl 行中查找标志,从而了解您正在使用警告,还是将其视为另一条评论?基本上,#!/usr/bin/perl -w 是否可移植到 Unix 上?
    • 克里斯,这是一个很好的问题,您可能希望将其作为一个问题单独推广。我没有窗户,所以我不能说,但通过试验证明它应该是相当容易的(有时比查看文档更快)
    • @Chris Lutz:是的。 perl 本身会解析 #!行并在需要时处理标志,但在启动时比实际在命令行上时稍晚,导致一些细微差别。
    • 太棒了。我像瘟疫一样避免了#!/usr/bin/perl -w,因为我不知道它是否可移植,但它的简洁性确实有一些吸引力。我会坚持我的“使用警告”;尽管。 TMTOWTDI。
    • use warnings 的好处是只适用于本地范围,而不是设置解释器对所有加载的模块应用警告。如果您使用非警告清除模块,这是不使用-w 的原因。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多