【问题标题】:How do I use a default array if no command line arguments are given?如果没有给出命令行参数,如何使用默认数组?
【发布时间】:2018-02-18 14:47:20
【问题描述】:

如果没有给出命令行参数,下面的内容似乎可以正常工作,但是当我得到的只是提供的参数数量,而不是参数本身。看来@ARGV|| 强制标量。我也试过使用or// 得到类似的结果。此处使用的正确运算符是什么?

say for @ARGV || qw/one two three/;

【问题讨论】:

  • 没有单一的运算符可以用来代替|| 来实现所需的工作。我能想到的最接近的是(@ARGV ? @ARGV : qw(one two))

标签: arrays perl default


【解决方案1】:

|| operator 根据其工作性质强加标量上下文

二进制"or" 返回两个周围表达式的逻辑析取。除了非常低的优先级之外,它等同于||

(强调我的)。因此,当它的左侧操作数是一个数组时,它会得到数组的长度。

但是,如果那是 0,则只计算右侧

这意味着它会短路:仅当左表达式为假时才计算右表达式。

C-Style Logical Or in perlop 中的内容

如果计算,标量或列表上下文会向下传播到正确的操作数。

所以在这种情况下你会得到列表。

没有运算符可以执行您的语句所需的操作。最接近的可能是

say for (@ARGV ? @ARGV : qw(one two));

但有更好、更系统的方法来处理@ARGV

【讨论】:

  • @ARGV = @ARGV || qw( one two three );
  • @Zaid perl -wE'@ary = qw(one two); say for (@ary = @ary || 1..3)' 打印 2 3
  • 哦,我忘了加上用法行:say for @ARGV;
  • @Zaid 遇到了类似的命运,根据 Сухой27 链接。但这很有趣:perl -wE'@ary = qw(a b); @ary = @ary || 1..3; say for @ary' 打印 2 3perl -wE'@ary = qw(a b); @ary = @ary || qw(1 2 3); say for @ary' 打印 2
【解决方案2】:

写成两行就行了。

@ARGV = qw[...] unless @ARGV;
say for @ARGV;

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2019-06-19
    • 2016-05-25
    • 2012-10-13
    • 2020-12-04
    • 2014-09-21
    • 1970-01-01
    • 2017-07-19
    • 2021-05-05
    相关资源
    最近更新 更多