前端之家收集整理的这篇文章主要介绍了
Perl--引用<1>,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C 里,间接的最常见的形式就是指针,它可以让一个变量 保存另外一个变量的内存地址。在 Perl 里,间接的最常
见的形式是引用。
创建引用:
你可以用一个反斜杠创建一个指向任何命名变量或者子过程的引用。(你还可以把它用于一个匿名 标量值,比如 7
或 "camel",尽管你通常并不需要这些东西。)乍一看,这个操作符的作用类似 C 里的 &(取址)操作符。
下面是一些例子:
$scalarref = \$foo;
$constref = \186_282.42;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*STDOUT;
8.3.7 闭合(闭包)
我们早些时候谈到过用一个没有名字的 sub {} 创建匿名子过程。你可以把那些子过程看作是在 运行时定义,这就
意味着它们有一个生成的时间和一个定义的地点。在创建子过程的时候,有些变量 可能在范围里,而调用子过程的
时候,可能有不同的变量在范围里。
先让我们暂时忘掉子过程,先看看一个指向一个词法变量的引用:
{
my $critter = "camel";
$critterref = \$critter;
}
$$critterref 的数值仍将是“camel”,即使在离开闭合的花括弧之后 $critter 消失了也如此。 但是 $critterref 也
可以指向一个指向了 $critter 的子过程:
{
my $critter = "camel";
$critterref = sub { return $critter };
}
[oracle@jhoa 2]$ cat 6.pl
{
my $critter = "camel";
$critterref = \$critter;
}
print "\$critter is $critter\n";
print "\$critterref is $critterref\n";
[oracle@jhoa 2]$ perl 6.pl
$critter is
$critterref is SCALAR(0x10c1060)
引用的本质是指针,存放的不是值,而是其他变量的地址。
不管这个地址怎么使用,它还是一个简单变量,所以用$表示。使用时通过此地址访问变量的值。
用\创建变量 \取变量地址
[oracle@jhoa 2]$ cat a2.pl
{my $a = "hello world";$ra=\$a;} print "$ra\n";
{my $a = "hello world";$ra=\$a;} print "$$ra\n";
[oracle@jhoa 2]$ perl a2.pl
SCALAR(0xea9f030)
hello world
1.引用变量的销毁:
[oracle@jhoa 2]$ cat a3.pl
{
my $ra;
{
my $a = "hello world";
$ra = \$a;
}
print "\$a is $a\n";
print "\$ra is $$ra\n";
}
print "\$ra is $$ra\n";
[oracle@jhoa 2]$ perl a3.pl
$a is
$ra is hello world
$ra is