2012-08-30 95 views
4

我想創建一個子程序,增加了逗號元素,並增加了最後一個元素前一個「和」最後一個元素,例如,使「12345」成爲前「1,2,3,4和5」。我知道如何添加逗號,但問題是我得到的結果是「1,2,3,4和5」,我不知道如何擺脫最後的逗號。添加一個「和」一個逗號插陣列在Perl

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應該得到逗號。

任何幫助表示讚賞。

+0

或者,如果任何人都可以提出這樣的一個完全不同的,更好的辦法,我所有的耳朵。 –

+0

我不知道'加入',所以這一直照亮!感謝所有回覆的人。 –

回答

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

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

與大多數其他答案不同,它也處理僅包含一個元素的列表。

+0

這是我最清楚的一個。謝謝! –

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"; 
+0

@ysth,謝謝,但我不知道如何。 – perreal

+0

看不到它失敗 – perreal

+0

我明白了,謝謝! – perreal

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; 
3

你可以使用join和修改的最後一個元素,包括一個and

my @list = 1 .. 5; 
$list[-1] = "and $list[-1]" if $#list; 
print join ', ', @list; 
1

就在TIMTOWTDI的精神(雖然,坦白地說,@ perreal的回答最好儘可能可讀性):

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

這有點類似於阿蘭的回答(更令人費解/複雜),但它的好處相比之下,它是可行的,如果你需要添加「和」任何其他元素比最後一個;當你知道確切的偏移量時(例如,最後一個元素),Alan只能工作。

3

這裏有一個CPAN模塊,Lingua::Conjunction。我自己使用它,並推薦它通過滾動你自己的解決方案。用法語法很簡單:

conjunction(@list); 
+0

哇,謝謝!我還在學習,但那裏有很多。 –

+0

不客氣。我自己錯過了好幾次,我想我只是找到了它,因爲有人指出了它。我想如果你不搜索「連接」,這是一個挑戰。 –

0

小提示

for(1 .. 10) { 
    print ; 
    $_ == 10 ? print '' : ($_ != 9 ? print ', ' : print ' and '); 
}