Arrays 如何将数组的最后一个值赋给变量

Arrays 如何将数组的最后一个值赋给变量,arrays,perl,Arrays,Perl,我试图用perl创建一个可管理的代码。我希望有这样的设置,以便在可能包含许多信息的数组中,我的最后一个值可以将最后一个值分配给$d。我仍然希望能够为将来扩展阵列的可能性腾出空间 ($a,$b,$c,@rest,$d)=(1,2,3,5,1,4,5,6,8,5,2,…4,7) 我希望$d等于最后一个值(7)。但是,我仍然希望能够在将来添加一个变量$e,该变量将再次保存新的最后一个值。如下 ($a,$b,$c,@rest,$d,$e)=(1,2,3,5,1,4,5,6,8,5,2,…4,7,8) 然

我试图用perl创建一个可管理的代码。我希望有这样的设置,以便在可能包含许多信息的数组中,我的最后一个值可以将最后一个值分配给$d。我仍然希望能够为将来扩展阵列的可能性腾出空间

($a,$b,$c,@rest,$d)=(1,2,3,5,1,4,5,6,8,5,2,…4,7)

我希望$d等于最后一个值(7)。但是,我仍然希望能够在将来添加一个变量$e,该变量将再次保存新的最后一个值。如下

($a,$b,$c,@rest,$d,$e)=(1,2,3,5,1,4,5,6,8,5,2,…4,7,8)


然后$d仍然保持为7,$e将变为8。我知道使用变量@rest将占用数组中所有剩余的值。我只是在寻找一种简单的方法来提取附加在数组末尾的所需变量。谢谢

您可以先填充@rest,然后使用从其末尾提取值。按相反顺序执行:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my ($A, $B, $c, @rest) = (1, 2, 3, 5, 1, 4, 5, 6, 8, 5, 2, 4, 7);
my $e = pop @rest;
my $d = pop @rest;
say "@rest | $d $e";
或者,使用,但必须手动计算变量:

my ($d, $e) = splice @rest, -2;

您可以先填充@rest,然后使用从其末尾提取值。按相反顺序执行:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my ($A, $B, $c, @rest) = (1, 2, 3, 5, 1, 4, 5, 6, 8, 5, 2, 4, 7);
my $e = pop @rest;
my $d = pop @rest;
say "@rest | $d $e";
或者,使用,但必须手动计算变量:

my ($d, $e) = splice @rest, -2;

或者,您可以将数组引用(
$ra
如下)用于匿名数组(
[…]

然后,您可以根据需要附加其他变量

当然,这需要将输入的一部分分离到匿名数组中

如果您不能做到这一点,另一个可管理的选项是首先为数组变量赋值,然后通过索引/切片(
@ary[0,1,2..4]
等)和/或使用
pop
更容易地使用


似乎输入的“第一”部分(以数组结尾)不会更改。然后提取这些数据,以便只保留将来可能增长的数据

my @data = (1..8, 25, 37); 

my $fixed_length = 5;  # number of points to always go into array

my ($v1, $v2, $v3, @ary) = splice @data, 0, 3+$fixed_length;

# (25 and 37 remain)  The section above needs no changes in future

while (my $datum = shift @data) {
    # deal with data that grows in time
}
这样可以最大限度地减少代码更改,只处理未来的数据

如果第一部分发生变化,那么就不会有好的解决方案;你可能想重新考虑一下这个设计


请注意,将新数据分配给单个变量并不是一个非常易于管理的方法。

或者您可以使用数组引用(
$ra
)作为匿名数组(
[…]

然后,您可以根据需要附加其他变量

当然,这需要将输入的一部分分离到匿名数组中

如果您不能做到这一点,另一个可管理的选项是首先为数组变量赋值,然后通过索引/切片(
@ary[0,1,2..4]
等)和/或使用
pop
更容易地使用


似乎输入的“第一”部分(以数组结尾)不会更改。然后提取这些数据,以便只保留将来可能增长的数据

my @data = (1..8, 25, 37); 

my $fixed_length = 5;  # number of points to always go into array

my ($v1, $v2, $v3, @ary) = splice @data, 0, 3+$fixed_length;

# (25 and 37 remain)  The section above needs no changes in future

while (my $datum = shift @data) {
    # deal with data that grows in time
}
这样可以最大限度地减少代码更改,只处理未来的数据

如果第一部分发生变化,那么就不会有好的解决方案;你可能想重新考虑一下这个设计


请注意,将新数据分配给单个变量并不是一个易于管理的方法。

谢谢。我曾考虑过使用pop,但我的数组仍然会随着时间的推移而增长,这就意味着要编写大量pop语句来释放变量。拼接似乎是一种选择,但我想我还是会设法找到一些更易于管理的东西,以便将来实现。谢谢。我曾考虑过使用pop,但我的数组仍然会随着时间的推移而增长,这就意味着要编写大量pop语句来释放变量。拼接似乎是一种选择,但我想我还是会设法找到一些更易于管理的东西,以便将来实现。@oghogdavidabire更新了另一个approach@OghoghoDavidAbire更新了另一种方法