Perl 数组引用和取消引用教程与示例

举报
Tiamo_T 发表于 2022/02/20 16:18:19 2022/02/20
【摘要】 在本文中,让我们通过示例了解如何引用和取消引用 Perl 数组。引用只不过是另一个变量的位置(地址)。引用可以是数组、散列或 Perl 代码片段。参考使 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]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。