基于this answer及其join
语句的最小代码
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);
print "Before join @input_list \n";
print join ",", @$_ for @input_list ;
print "After join @input_list \n";
给出了
Before join 20 40 60 80 120 140 16 180 20
After join 20 40 60 80 120 140 16 180 20
但在use strict;
使用“严格参考”时,不能使用字符串(“10”)作为ARRAY参考号 test4.pl第10行。
join
在manual中加入单独的数组字符串。
这里代码尝试使用数组项的每个哈希(@$_
)显然加入逗号。
然而,这似乎正在发生。
为什么这个错误出现在最小代码中?
答案 0 :(得分:7)
好的,你在这里做了什么:
print join ",", @$_ for @input_list ;
不能工作,因为它是:
@input_list
将每个元素提取到$_
。$_
假装它是一个数组@$_
。 这与尝试:
基本相同print join ( ",", @{"10"} );
这没有任何意义,因此不起作用。
my $string = join ( ",", @input_list );
print $string;
会做的伎俩。
我认为你在这里失踪的是:
use Data::Dumper;
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);
print Dumper \@input_list;
不会生成多维列表。它是一维的。
$VAR1 = [
'10',
'20',
'30',
'40',
'60',
'70',
'8',
'90',
'10'
];
我怀疑你可能想要的是:
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (\@x, \@y);
或者也许:
my $x_ref = [ qw/10 20 30 40/ ];
my $y_ref = [ qw/60 70 8 90 10/ ];
my @input_list = ($x_ref, $y_ref );
这使得@input_list
:
$VAR1 = [
[
'10',
'20',
'30',
'40'
],
[
'60',
'70',
'8',
'90',
'10'
]
];
然后你的' for'循环工作:
print join (",", @$_),"\n" for @input_list ;
因为那时,@input_list
实际上是2个项目 - 两个数组引用,然后您可以取消引用和加入。
虽然是一个轻微的警告 - 在做的时候可能会发生其中一个问题:
my @input_list = (\@x, \@y);
因为您正在插入对@x
和@y
的引用 - 如果您重复使用其中任何一项,那么您将更改@input_list
的内容 - 这就是为什么使用my @input_list = ( $x_ref, $y_ref );
可能更好。
答案 1 :(得分:4)
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);
这相当于:
my @input_list = qw/10 20 30 40 60 70 8 90 10/;
要创建数组数组,请使用引用:
my @input_list = (\@x, \@y);
然后您的其余代码将按预期工作。