在perl中以相反的顺序打印数组元素

时间:2017-01-13 20:12:02

标签: perl

我试图以相反的顺序打印数组的元素,从最后一个元素开始到第0个元素,当我不知道列表计数时,不使用反向函数。这是输入和输出。

#!/usr/bin/perl/
use warnings;
use strict;

@months = (January, February, March, April, May, June, July, August);
print @months[-6 .. 0];
print @months[-1 .. 0];

它给我的输出是

MarchAprilMayJuneJulyAugustJanuary
AugustJanuary

但我想要的是,它应该打印出来

AugustJulyJuneMayAprilMarchFebruaryJanuary

任何人都可以帮忙。我是一名perl初学者。

4 个答案:

答案 0 :(得分:7)

@months[-6 .. 0], @months[-1 .. 0]

@months[-6 .. 0, -1 .. 0]

装置

@months[-6, -5, -4, -3, -2, -1, 0, -1, 0]

但你想要

@months[-1, -2, -3, -4, -5, -6, -7, -8]

或只是

@months[7, 6, 5, 4, 3, 2, 1, 0]

显而易见的解决方案是

reverse(@months)

其他有效的表达方式:

@months[ map { -$_ } 1..@months ]

@months[ map { $#months-$_ } 0..$#months ]

map { $months[-$_] } 1..@months

map { $months[ $#months-$_ ] } 0..$#months

use feature qw( current_sub );
sub { @_ ? pop(@_), __SUB__->(@_) : () }->(@months)

do { my @reversed; for my $month (@months) { unshift(@reversed, $month) } @reversed }

就地解决方案:

for (0..@months/2-1) {
   ($month[$_], $month[-$_-1]) = ($month[-$_-1], $month[$_]);
}

答案 1 :(得分:4)

在伪代码中:

while array is not empty
    element ← pop from array
    print element
end

我将把它作为练习让你找到函数的实际名称。 ☺

答案 2 :(得分:3)

仅限" 打印元素"

while (my $mon = pop @months) { say $mon }

say pop @months while @months;

或者,正如Сухой27

的评论中所给出的那样
print $months[-$_] for 1..@months;

原帖(包含在早期的ikegami答案中)。

" 没有反向功能"

my @nums = 1..5;

my @rev_ind = map { -$_ + $#nums } 0..$#nums;

print "@nums[@rev_ind]\n";

打印5 4 3 2 1

答案 3 :(得分:0)

这是从数组,从最后一个元素到第一个元素以相反顺序处理可变数量元素的另一种通用方法:

my @months = (January, February, March, April, May, June, July, August);

for (my $i = $#months; $i >= 0; $i--) { 
  print $months[$i];
}