硬引用(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);