Perl中push和unshift有什么区别?

Abh*_*Rao 6 perl

有人可以解释为什么push的行为方式如下所示?

基本上,我想打印由填充的数组值push,以及unshift.

当我尝试打印push使用数组索引填充的数组内容时,它总是在数组顶部打印元素,而填充的数组则unshift打印基于数组索引的数组内容.我不明白为什么.

与不合时宜的

#!/usr/bin/perl
@names = ("Abhijit","Royal Enfield","Google");
@numbers=();
$number=1;
$i=0;
foreach $name (@names) {
    #print $_ . "\n";
    $number=$number+1;
    #push(@numbers,($number));
    unshift(@numbers,($number));
    print("Array size is :" . @numbers . "\n");
    $i=$i+1;
    print("Individual Elements are:" . @numbers[i] . "\n");
    pop(@numbers);
}

rhv:/var/cl_ip_down>./run.sh
Array size is :1
Individual Elements are:2
Array size is :2
Individual Elements are:3
Array size is :3
Individual Elements are:4
Run Code Online (Sandbox Code Playgroud)

没有移位

#!/usr/bin/perl
@names = ("Abhijit","Royal Enfield","Google");
@numbers=();
$number=1;
$i=0;
foreach $name (@names) {
    #print $_ . "\n";
    $number=$number+1;
    push(@numbers,($number));
    #unshift(@numbers,($number));
    print("Array size is :" . @numbers . "\n");
    $i=$i+1;
    print("Individual Elements are:" . @numbers[i] . "\n");
}

rhv:/var/cl_ip_down>./run.sh
Array size is :1
Individual Elements are:2
Array size is :2
Individual Elements are:2
Array size is :3
Individual Elements are:2
Run Code Online (Sandbox Code Playgroud)

/ 没有pop /

#!/usr/bin/perl
@names = ("Abhijit","Royal Enfield","Google");
@numbers=();
$number=1;
$i=0;
foreach $name (@names) {
    #print $_ . "\n";
    $number=$number+1;
    #push(@numbers,($number));
    unshift(@numbers,($number));
    print("Array size is :" . @numbers . "\n");
    $i=$i+1;
    print("Individual Elements are:" . @numbers[i] . "\n");
    #pop(@numbers);
}

rhv:/var/cl_ip_down>./run.sh
Array size is :1
Individual Elements are:2
Array size is :2
Individual Elements are:3
Array size is :3
Individual Elements are:4
Run Code Online (Sandbox Code Playgroud)

用pop

#!/usr/bin/perl
@names = ("Abhijit","Royal Enfield","Google");
@numbers=();
$number=1;
$i=0;
foreach $name (@names) {
    #print $_ . "\n";
    $number=$number+1;
    #push(@numbers,($number));
    unshift(@numbers,($number));
    print("Array size is :" . @numbers . "\n");
    $i=$i+1;
    print("Individual Elements are:" . @numbers[i] . "\n");
    pop(@numbers);
}

rhv:/var/cl_ip_down>./run.sh
Array size is :1
Individual Elements are:2
Array size is :1
Individual Elements are:3
Array size is :1
Individual Elements are:4
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 28

你真的应该使用use strict;,并use warnings;在你的代码.激活它们将允许您识别代码中的错误.

更改以下所有实例:

foreach $name (@names)- > for my $i (@names)因为你没有对@names数组中的元素做任何事情.

@numbers[i]- > $numbers[$i]因为这是你使用数组切片而不是引用数组元素的一个不常见的错误.

这不是C.每个"变量"必须具有印记($,@,%,&在它的前面,等等).那i应该是真的$i.


至于push和之间的区别shift,文档说明:

perldoc -f push:

推送ARRAY,LIST

将ARRAY视为堆栈,并将LIST的值推送到ARRAY 的末尾.ARRAY的长度增加了LIST的长度....返回完成"推送"后数组中的元素数.

perldoc -f unshift:

不合时宜的ARRAY,LIST

与转变相反.或者与推动相反,取决于你如何看待它.Prepends列表到数组的前面,并返回数组中新的元素数.


把它用于ASCII-matically ...

        +---------+           +-----------+        +---------+ 
<-----  | ITEM(S) |  ----->   | (@) ARRAY | <----- | ITEM(S) | ----->
 shift  +---------+  unshift  +-----------+  push  +---------+   pop
                              ^           ^
                              FRONT       END
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢ASCII图. (2认同)

b.r*_*oth 13

unshift用于在数组的开头添加一个或多个值:

与a相反shift.或者与a相反push,取决于你如何看待它.

然后,新值成为数组中的第一个元素.

push将元素添加到数组的末尾:

ARRAY作为一个堆栈,并且推动的值LIST上的端部ARRAY.

  • 感谢编辑思南.它现在肯定更好的格式和解释. (2认同)

Sin*_*nür 7

这应该是一个评论,但对于评论框来说太长了,所以在这里.

如果你想说明unshiftpush之间的区别,以下就足够了:

#!/usr/bin/perl

use strict; use warnings;

my @x;

push @x, $_ for 1 .. 3;

my @y;

unshift @y, $_ for 1 .. 3;

print "\@x = @x\n\@y = @y\n";
Run Code Online (Sandbox Code Playgroud)

输出:

@x = 1 2 3
@y = 3 2 1

注意use strict;保护您免受许多程序员错误的影响,并use warnings;在您使用可疑值构造时向您发出警告.在你的水平,两者都不是可选的.