如何使用加入?

How to use join?

基于 及其 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;

Can't use string ("10") as an ARRAY ref while "strict refs" in use at test4.pl line 10.

joinmanual 中加入单独的数组字符串。 这里的代码试图将逗号显然与数组项的每个散列 (@$_) 连接起来。 然而,这似乎正在发生。

为什么最小代码这里会出现这个错误?

好的,你在这里做什么:

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 );

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);

您的其余代码将按预期工作。