Arrays Perl数组是否包含自身?

Arrays Perl数组是否包含自身?,arrays,perl,Arrays,Perl,我不明白这段代码是怎么回事 我把它的输出和注释放在中间,在生成它的打印语句之后。 my @regions = ( 0, 1, 2, [ 0, new Point(3,1), new Point(3,2), new Point(3,3) ], 4, 5 ); $reg1 = 3; print "1: $regions[$reg1] \n"; @reg1 = @{regions[$reg1]}; print "2: $reg1[0]\n"; print "3: $reg1[0][1]\n"; p

我不明白这段代码是怎么回事

我把它的输出和注释放在中间,在生成它的打印语句之后。

my @regions = (
0,
1,
2,
[ 0, new Point(3,1), new Point(3,2), new Point(3,3) ],
4,
5 );

$reg1 = 3;
print "1: $regions[$reg1] \n";

@reg1 = @{regions[$reg1]};
print "2: $reg1[0]\n";
print "3: $reg1[0][1]\n";
print "4: ", Point::stringPoint($reg1[0][1]), "\n";

# HERE IS THE OUTPUT from the above print statements, with comments about my confusion appended
1: ARRAY(0xe8b0e0)      # ok - element 3 of @regions is an array, as expected.
2: ARRAY(0xe8b0e0)      # It appears to be an array of one element, which is itself. ???
3: Point=HASH(0xfda5e0) # We have go 'down' one more level to get what we want - that makes no sense
4: 3,1                  # Yes, there it is

package Point;
sub new {
   my $class = shift;
   my $self = {
      x => shift,
      y => shift
   };
   bless $self, $class;
   return $self;
}

sub stringPoint
{
 my $p = shift;
 return "$p->{x},$p->{y}";
}

" Code related to new question (with output) " ;
我真正的问题是:
如何直接方便地使用阵列,
哪个在另一个数组中(不是它的副本)?
唯一的方法是(始终)取消引用引用吗?
例如下面的两个非工作示例

以下是我尝试过的:

my $ref1 = \@{$regions[3]};

@{$ref1}[2] = new Point(4, 5);  # changes original array
print1Region(3, $ref1);
# OUTPUT = (3,1) (4,5) (3,3)

my @arr1 = @{$ref1};
$arr1[1] = new Point(2,6);  # does not
print1Region(3, $ref1);
# OUTPUT = (3,1) (4,5) (3,3)

$ref1[0] = new Point(1,4);  # does not
print1Region(3, $ref1);
# OUTPUT = (3,1) (4,5) (3,3)

@{regions[$reg1]}
是一种奇怪的、没有文档记录的书写方式
@regions[$reg1]
。(这是一种记录在双引号字符串文本中使用的语法。)

@regions[$reg1]
是一个包含一个元素的数组片,这是一种奇怪的写入
$regions[$reg1]
的方式

因此,您不会像您想象的那样获得由
$regions[$reg1]
引用的数组的第一个元素;您只需获得
@区域的第一个元素


让我们看看

my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
问题#1

\@
“取消”,所以

这只是一种复杂的写作方式

my $ref1 = $regions[3];
(好吧,这不完全正确,因为前者会自动存活,但这与此处无关。)

问题#2

同样,您使用的是一个元素的数组片。始终使用
严格使用;使用警告并注意警告

@{$ref1}[2] = new Point(4, 5);
应该是

${$ref1}[2] = new Point(4, 5);
$ref1->[2] = Point->new(4, 5);
用“箭头符号”写得更清楚

问题#3

最后,不要使用间接方法调用。它们会引起问题

$ref1->[2] = new Point(4, 5);
应该是

${$ref1}[2] = new Point(4, 5);
$ref1->[2] = Point->new(4, 5);
结论

my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
应写为

my $ref1 = $regions[3];
$ref1->[2] = Point->new(4, 5);
如果没有变量,这将是

$regions[3]->[2] = Point->new(4, 5);
或者只是

$regions[3][2] = Point->new(4, 5);

@{regions[$reg1]}
是一种奇怪的、没有文档记录的书写方式
@regions[$reg1]
。(这是一种记录在双引号字符串文本中使用的语法。)

@regions[$reg1]
是一个包含一个元素的数组片,这是一种奇怪的写入
$regions[$reg1]
的方式

因此,您不会像您想象的那样获得由
$regions[$reg1]
引用的数组的第一个元素;您只需获得
@区域的第一个元素


让我们看看

my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
问题#1

\@
“取消”,所以

这只是一种复杂的写作方式

my $ref1 = $regions[3];
(好吧,这不完全正确,因为前者会自动存活,但这与此处无关。)

问题#2

同样,您使用的是一个元素的数组片。始终使用
严格使用;使用警告并注意警告

@{$ref1}[2] = new Point(4, 5);
应该是

${$ref1}[2] = new Point(4, 5);
$ref1->[2] = Point->new(4, 5);
用“箭头符号”写得更清楚

问题#3

最后,不要使用间接方法调用。它们会引起问题

$ref1->[2] = new Point(4, 5);
应该是

${$ref1}[2] = new Point(4, 5);
$ref1->[2] = Point->new(4, 5);
结论

my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
应写为

my $ref1 = $regions[3];
$ref1->[2] = Point->new(4, 5);
如果没有变量,这将是

$regions[3]->[2] = Point->new(4, 5);
或者只是

$regions[3][2] = Point->new(4, 5);

@{regions[$reg1]}
-确定吗?尝试将其更改为
@{$regions[$reg1]}
@Shawn-这一更改使该程序工作得更合理,但让我回到“未简化”版本,看看为什么我没有首先使用您的构造。@Shawn-好的,我想我明白了。。。它必须将这些东西传递给子例程,并在需要时使用\ right来获取引用。谢谢你的帮助。注意如果你
使用警告就像你一直应该做的那样,perl会在这一行附近警告你(我不明白的是,为什么我没有给出一个实际的答案,是为什么这被视为一个数组片段而不是一个语法错误)
@{regions[$reg1]}
-确定吗?尝试将其更改为
@{$regions[$reg1]}
@Shawn-这一更改使该程序工作得更合理,但让我回到“未简化”版本,看看为什么我没有首先使用您的构造。@Shawn-好的,我想我明白了。。。它必须将这些东西传递给子例程,并在需要时使用\ right来获取引用。谢谢你的帮助。注意如果你
使用警告就像您一直应该做的那样,perl会在这一行附近警告您。(我不明白的是,为什么我没有给出一个实际的答案,是为什么这会被视为一个数组片段而不是语法错误)感谢您所做的一切。我认为接下来的路是$ref1->[下标]。首先,这个问题的全部原因是我不想一直写$regions[$reg1]——它不仅仅是这一行代码,它是一个完整的部分,涉及其中的两个,以及这些数组元素的许多用法。因此,我们需要一个区域元素的临时变量。谢谢大家。我认为接下来的路是$ref1->[下标]。首先,这个问题的全部原因是我不想一直写$regions[$reg1]——它不仅仅是这一行代码,它是一个完整的部分,涉及其中的两个,以及这些数组元素的许多用法。因此,需要为区域元素设置一个临时变量。