硬引用(hard reference),也叫指针(pointer),它本身是一个标量型变量,它的值是其他变量的地址,我们可以通过反斜杠(\)运算符来创建指针。
举例:
$name = "woniu";
$p = \$name;
print $name; #这里我们得到的 是 woniu
print $p; #这里我们得到的是$name在内存中的地址,如SCALAR(0xb067c)
$name = "woniu";
$p = \$name;
print $name; #这里我们得到的 是 woniu
print $p; #这里我们得到的是$name在内存中的地址,如SCALAR(0xb067c)
@str_list = qw(a b c d);
$p_str = \@str_list;
print $p_str; #这里我们得到的是@str_list在内存中对应的地址,如ARRAY(0x322c6c).
从上面的例子可以看到如何创建指针以及指针是那种变量类型,以及指针变量的值。 在打印指针变量的时候我们不但可以看到一个十六进制的地址,还能看到这个地址上保存的数据的数据类型,在我们的例子中$p的值是一个SCALAR类型变量。
那么如何访问指针地址呢
--------------------------------------------一个典型的应用场景:-----------------------------------------------------------------
当一个子例程接收参数的时候,会把所有的参数都保存到一个特殊的数组@_里面去,假如把两个数组一起传递进去的话,那么这两个数组都将保存到@_中,并且练成一个单个列表。 问题在于如果我们不知道数组的长度的话,在子例程中就无法拆分这两个数组了,使用指针参数将能很好的解决这个问题。
具体的操作办法就是不直接传递两个数组,而是传递这两个数组的指针,然后在子例程里面按照指针地址访问。
@example = (1..4);
@b = (a..d);
$p_b = \@b;
sub display{
print @_."wwwwwwwwww\n";
my ($aa,$bb)=(shift,shift);
print @$aa;#打印1234
print "@$bb"."\n";#打印a b c d
}
display(\@example,\@b);