4

我想创建一个向元素添加逗号并在最后一个元素之前添加“和”的子例程,例如,使“12345”变为“1、2、3、4 和 5”。我知道如何添加逗号,但问题是我得到的结果是“1、2、3、4 和 5”,我不知道如何去掉最后一个逗号。

sub commas {
  my @with_commas;
  foreach (@_) {
    push (@with_commas, ($_, ", ")); #up to here it's fine
    }
    splice @with_commas, -2, 1, ("and ", $_[-1]);
    @with_commas;
  }

正如您可能知道的那样,我正在尝试删除新数组中的最后一个元素(@with_commas),因为它附加了逗号,并添加了旧数组中的最后一个元素(@_,传递给子例程来自主程序,没有添加逗号)。

当我运行它时,结果是,例如,“1、2、3、4 和 5”——最后是逗号。那个逗号是从哪里来的?只有@with_commas 应该得到逗号。

任何帮助表示赞赏。

4

7 回答 7

7
sub format_list {
   return "" if !@_;
   my $last = pop(@_);
   return $last if !@_;
   return join(', ', @_) . " and " . $last;
}

print format_list(@list), "\n";

与大多数其他答案不同,这也处理只有一个元素的列表。

于 2012-08-30T16:40:42.063 回答
3

您可以使用join和修改最后一个元素以包含and

my @list = 1 .. 5;
$list[-1] = "and $list[-1]" if $#list;
print join ', ', @list;
于 2012-08-30T16:39:08.200 回答
3

有一个 CPAN 模块,Lingua::Conjunction。我自己使用它,并推荐它而不是滚动您自己的解决方案。使用语法非常简单:

conjunction(@list);
于 2012-08-30T20:43:21.467 回答
2
#!/usr/bin/perl

use warnings;
use strict;

sub commas {
  return ""    if @_ == 0;
  return $_[0] if @_ == 1;
  my $last = pop @_; 
  my $rest = join (", ", @_);
  return $rest.", and ".$last;
}

my @a = (1,2,3,4,5);
print commas(@a), "\n";
于 2012-08-30T16:35:43.107 回答
1

添加逗号,然后添加“和”:

use v5.10;

my $string = join ', ', 1 .. 5;

substr 
    $string, 
    rindex( $string, ', ' ) + 2,
    0,
    'and '
    ;

say $string;

因此,在您有两个以上元素的情况下进行操作:

use v5.10;

my @array = 1..5;
my $string = do {
    if( @array == 1 ) {
        @array[0];
        }
    elsif( @array == 2 ) {
        join ' and ', @array
        }
    elsif( @array > 2 ) {   
        my $string = join ', ', @array;

        my $commas = $string =~ tr/,//;

        substr 
            $string, 
            rindex( $string, ', ' ) + 2,
            0,
            'and '
            ;

        $string;
        }
    };      

say $string;
于 2012-08-30T16:36:08.357 回答
1

只是本着 TIMTOWTDI 的精神(尽管坦率地说,@perreal 的答案在可读性方面更好):

sub commas {
    my $last_index = $#_;
    my @with_commas = map { (($_==$last_index) ? "and " : "") . $_[$_] }
                          0 .. $last_index;
    print join("," @with_commas)
}

这有点类似于 Alan 的回答(更复杂/复杂),但与之相比的好处是,如果您需要在除最后一个元素之外的任何 OTHER 元素中添加“和”,它会起作用;只有当您知道确切的偏移量(例如最后一个元素)时,艾伦才有效

于 2012-08-30T16:48:01.220 回答
0

小提示

for( 1 .. 10 ) {
     print ;
     $_ == 10 ? print '' : ($_ != 9 ? print ', ' : print ' and ');
}
于 2013-06-12T16:04:47.190 回答