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]——它不仅仅是这一行代码,它是一个完整的部分,涉及其中的两个,以及这些数组元素的许多用法。因此,需要为区域元素设置一个临时变量。