给定列表(a, b, c)
创建字符串的最好方法是什么,其中逗号分隔所有元素,除了由'和a, b and c
分隔的最后一个元素。理想情况下,这也适用于一个和两个元素列表。
答案 0 :(得分:6)
在这种情况下,在一个语句中干扰所有内容会使解决方案更难阅读。
sub nice_join {
my $last = pop;
return $last if !@_;
return join(', ', @_) . " and $last";
}
如果你想要除了undef以外的东西没有参数,
sub nice_join {
return "none" if !@_;
my $last = pop;
return $last if !@_;
return join(', ', @_) . " and $last";
}
答案 1 :(得分:3)
#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Test::More;
sub nice_join {
my @connectors = (q(), (', ') x (@_ - 2), ' and ');
return join q(), map shift(@connectors) . $_, @_
}
is nice_join(qw( a )), 'a', 'single';
is nice_join(qw( a b )), 'a and b', 'double';
is nice_join(qw( a b c )), 'a, b and c', 'treble';
done_testing();
对于牛津逗号,您需要将数组更改为
my @connectors = (q(), (', ') x (@_ - 2), (',' x (@_ > 2)) . ' and ');
答案 2 :(得分:2)
我的想法是,最简单的方法就是使用join来制作以逗号分隔的列表,然后将最终的逗号转换为and
我认为这显示了
my @list = qw(a b c);
my $nice = join(', ', @list) =~ s/ .* \K , / and/xr;
say $nice;
<强>给予强>
a, b and c
答案 3 :(得分:1)
在问一个问题之前,请记住搜索问题之前已经问过类似的问题(但是对于Python):How to efficiently join a list with commas and add "and" before the last element
你可以在perl中执行此操作的一种方法是:
#!/usr/bin/perl
use v5.10;
my @list = qw( a b c );
say join ' and ', $#list ? ( join(', ', @list[0..$#list-1]), $list[-1] ) : @list if @list;
将打印:
a
列表qw( a )
; a and b
列表qw( a b )
;和a, b and c
列表qw( a b c )
。如果列表为空,则不会打印任何内容。