Perl 数组引用和取消引用教程与示例
在本文中,让我们通过示例了解如何引用和取消引用 Perl 数组。引用只不过是另一个变量的位置(地址)。引用可以是数组、散列或 Perl 代码片段。参考使 Perl 代码运行得更快。
Perl 对数组的引用
通常,我们将元素列表存储在数组中,如下所示。
@array = (“one”,”two”,”three”,”four”,”five”);
要将数组引用分配给变量,请使用反斜杠(\)运算符,如下所示
$array_ref = \@array;
如果您尝试打印 $array_ref 变量,您将得到如下内容。
ARRAY(0x1a2b3c)
Perl 数组引用也可以传递给子程序,如下所示。
sub add_numbers
{
my $array_ref = shift;
.....
}
@numbers = (11,2,3,45);
$array_ref = add_numbers(\@numbers);
在上面的代码片段中,我们需要取消引用数组,以便子例程可以从原始数组中获取元素。
以下是将引用传递给子例程而不是传递整个数组的一些优点。
- 如果我们将数组传递给子程序,Perl 会将整个数组复制到 @_ 变量中。当数组很大时,这不是一个有效的方法。
- 当我们希望子程序修改原始数组时,我们需要传递数组的引用。
- 引用在构建复杂的数据结构中起着至关重要的作用。
我们可以将匿名数组的引用放入标量变量中,如下所示。
$array_ref = [ 11,2,3,45];
Perl 取消引用数组
在子例程中,可以使用下面显示的方法之一来完成取消引用。
引用变量可以被取消引用,如下所示。使用这种方法,我们可以获取数组的所有元素。这与@numbers 相同。
@{ $array_ref };
要获取数组中的特定元素,请执行以下操作。该语句给出了@numbers 数组的第一个元素。这与 $numbers[0] 相同
$ { $array_ref }[0]
可以直接从 Perl 内置变量访问数组元素,而不是将引用存储到变量中。
# Get all the elements of @numbers array.
@ { $_[0] }
# Get a particular element. This gives the first element of the array.
$ { $_[0] } [0]
注意:如果我们取消引用一个简单的标量变量,那么我们可以省略大括号,如下所示。
@$array_ref # same as @{ $array_ref }
$$array_ref # same as $ { $array_ref }
$_[0] # not a simple scalar variable and this cant be dereferenced,
将多个引用存储到 Perl 数组中
让我们使用以下示例 Perl 代码片段。
#Array contains source ip and destination ip
@IP = ('192.168.1.10','192.168.1.15');
#Array contains the source port and destination port numbers
@PORT = ("5000","5002");
#Sublayers of TCP layer
@TCP = ("Q931","H225","H245");
#Common layers are available in a TCP packet.
@LAYER = ("ETHERNET","IP",\@TCP);
@PKT = (
\@IP,
\@PORT,
\@LAYER
);
#Storing the reference of @PKT array into the scalar variable.
$array_ref = \@PKT;
为了理解数组引用,让我们假设从上面的代码片段中,我们想要访问 TCP 层的第二个子层(“H225”)。这可以如下所述进行。
首先,我们必须访问 LAYER 数组。这将返回 @LAYER 数组的引用。
$ { $array_ref } [2]
$array_ref 是一个简单的标量变量。所以,大括号可以省略,也可以写成如下图。
$$array_ref[2]
接下来,通过此引用访问第三个元素/层(来自@LAYER)。
$ { $ { $array_ref } [2] } [2]
这将返回 @TCP 数组的地址。
最后,我们可以得到 TCP 层的第二个子层(来自@TCP 数组),如下图所示。
$ { $ { $ { $array_ref } [2] } [2] } [1]
上面看起来很复杂,降低了代码的模块化。有一项规定是重写上述语句,并通过以下方式使其更容易阅读。
在 Perl 中,$ { VAR } [ $y] 可以写成 VAR->[$y]。
$ { $array_ref } [2] is same as $array_ref->[2]
$ { $ { $array_ref } [2] } [2] is same as $array_ref->[2]->[2]
$ { $ { $ { $array_ref } [2] } [2] } [1] is same as $array_ref->[2]->[2]->[1]
现在,使用“下拉箭头”规则,我们可以重写它,如下所示。根据“下拉箭头”规则,我们不能删除第一个箭头。这更容易阅读。
$array_ref->[2][2][1]
- 点赞
- 收藏
- 关注作者
评论(0)