【问题标题】:Perl counter print list with commas except last itemPerl 计数器用逗号打印列表,除了最后一项
【发布时间】:2019-02-20 16:29:40
【问题描述】:

我在尝试执行带有 2 个数字参数的 perl 脚本时遇到问题,比如 $ARGV[0] 是 2,$ARGV[1] 是 4。我需要打印一个显示 2 的列表, 3,4 最后一项后没有逗号。以下是我现在的脚本:

unless ((@ARGV)==2){
        print "error: incorrect number of arguments",
        "\n",
        "usage: inlist.pl a b (where a < b)",
        "\n";
                exit VALUE;
}

if ($ARGV[0] > $ARGV[1]){
        print "error: first argument must be less than second argument",
        "\n",
        "usage: intlist.pl a b (where a < b)",
        "\n";
                exit VALUE;
}
else {

        $COUNTER=$ARGV[0];

        while($COUNTER <= $ARGV[1]){
 print $COUNTER;
                $COUNTER += 1;
        if ($COUNTERELATIONAL < $ARGV[1]){
                print ", ";
        }
        else {
                print "\n";
        }
$COUNTERSYNTAX
        }
}
exit VALUE;

我尝试使用 join 但无济于事,我一直得到 2,3,4 的返回,

我觉得我一定错过了一些简单的东西

【问题讨论】:

  • perl -le 'print join(",", $ARGV[0]..$ARGV[1])' 2 4 产生2,3,4。如果您的数字将达到数百万,可能有更好的方法来做到这一点,但至少它使用更紧凑的符号为您设置了另一个方向。
  • 代码中的 VALUE 字眼令人费解——在编写 Perl 脚本时不要忘记使用 use strict;use warnings;。专家使用它们来确保他们没有犯任何愚蠢的错误;新手也应该​​出于同样的原因使用它们。

标签: perl


【解决方案1】:

重写代码以简化它:

# Prefer 'if' over 'unless' in most circumstances.
if (@ARGV != 2) {
    # Consider using 'die' instead of 'print' and 'exit'.
    print "error: incorrect number of arguments\n",
          "usage: inlist.pl a b (where a < b)\n";

    # Not sure what VALUE is, but I assume you've
    # defined it somewhere.
    exit VALUE;
}

if ($ARGV[0] > $ARGV[1]) {
    # Consider using 'die' instead of 'print' and 'exit'.
    print "error: first argument must be less than second argument\n",
          "usage: intlist.pl a b (where a < b)\n";

    exit VALUE;
}

# Removed 'else' branch as it's unnecessary.
# Use 'join' instead of a complicated loop.
print join(',', $ARGV[0] .. $ARGV[1]), "\n";

# This looks like a successful execution to me, so
# that should probably be 'exit 0'.
exit VALUE;

如果我是为自己写的,我会缩短一点:

my %errors = (
  NUMBER => 'incorrect number of arguments',
  RANGE  => 'first argument must be less than second argument',
);

my $usage = 'usage: inlist.pl a b (where a < b)';

die "$errors{NUMBER}\n$usage\n" if @ARGV != 2;
die "$errors{RANGE}\n$usage\n"  if $ARGV[0] > $ARGV[1];

print join(',', $ARGV[0] .. $ARGV[1]), "\n";

exit 0;

【讨论】:

    【解决方案2】:

    我想通了:

    while($COUNTER <= $ARGV[1]){
            print $COUNTER;
            $COUNTER += 1;
    if ($COUNTER <= $ARGV[1]){
            print ", ";
    }
    else {
            print "\n";
    }
    

    我需要将 if 更改为 $COUNTER 和

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2021-10-25
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多