声明一个Perl数组并通过数组切片分配它

时间:2015-05-16 14:02:19

标签: perl slice

我试图拆分字符串并重新排列结果,所有这些都在一个声明中:

my $date_str = '15/5/2015';
my @directly_assigned_date_array[2,1,0] = split ('/', $date_str);

这导致:

syntax error at Array_slice_test.pl line 16, near "@directly_assigned_date_array["

为什么会出错?

以下情况很好:

my @date_array;
@date_array[2,1,0] = split ('/', $date_str);

@ vol7ron提供了一种不同的方式:

my @rvalue_array = (split '/', $date_str)[2,1,0];

它确实起到了作用,但至少对我来说看起来不直观。

2 个答案:

答案 0 :(得分:3)

由于您只是反转分割数组,您可以使用以下单个语句完成相同的操作:@date_array = reverse(split('/',$date_str));

答案 1 :(得分:3)

其他人在这里了解更多关于Perl内部的知识,但我认为它无法执行操作,因为数组切片引用的数组元素尚不存在。由于数组尚未声明,因此无法知道要引用的地址。

my @array = ( split '/', $date_str )[2,1,0];

这是有效的,因为split返回列表上下文中的值。列表和数组在Perl中非常相似。您可以将数组视为超级列表,具有额外的功能。无论您如何选择它,您都可以像数组切片一样执行列表slice

在上面的代码中,您将获取列表,然后使用切片重新排序,然后将其分配给数组。一开始可能会有不同的想法,但它不应该太难。通常,您希望在赋值的rhs上执行数据操作(修改和排序),并将lhs作为接收端。

请记住,我还删除了一些括号,并使用Perl的智能操作解释顺序来减少语法。相同的代码可能看起来像以下(相同的操作,只是更多的绒毛):

my @array = ( split( '/', $date_str ) )[2,1,0];

@luminos所述,由于您只有3个元素,您可以手动将其反转,您可以使用反向功能;我们可以再次利用Perl的魔术操作顺序,并在此处删除括号:

my @array = reverse split '/', $date_str;

但是在这种情况下它可能太神奇了,所以根据你的编码实践指南,你可能想要包括一组括号用于拆分或反向,如果它增加了可读性和理解力。