perl 引用

不管是从理论还是实践的角度出发, Perl 都是偏爱平面线性的数据结构的.

假设你想制作一个二维数组, 显示一组人员的生理数据. 包括年龄、眼睛的颜色和重量等. 可以通过先给每一个独立的成员创建一个数组来实现.

my @john = (47, "brown", 186);
my @mary = (23, "hazel", 128);
my @bill = (35, "blue",  157);

然后你就可以构造一个附加的数组, 该数组由其他数组的名字组成.

my @vitals = ("john", "mary", "bill");

在小镇上过了一夜之后, John 的眼睛突然变成了"红色", 我们需要一个方法可以仅仅通过使用字符串 "john" 就可以改变数组 @john 的内容. 在 Perl 语言中实现的最常见的形式就是引用(reference).

什么是引用?



在上述例子中, $vitals[0] 的值是 "john". 也就是说它正好包含另外一个变量的名字. 我们说第一个变量应用了第二个变量, 并且这种引用叫符号引用, 因为 Perl 必须在符号表中找出 @john 来才能找到它.

另外一种引用是硬引用, 这种引用是大多数人使用的方法. 如果我们没有指定是那种引用, 那么我们说的就是硬引用.

一个叫 $bar 的变量引用了一个叫 $foo 的变量的内容, 而 $foo 的值是 "bot". 和符号引用不同的是, 硬引用引用的不是另外一个变量的名字, 而是数值本身.

引用可以指向任何数据结构. 因为引用是标量, 所以可以把他们保存在数组和散列中. 从而就有了很多复杂的数据结构, 数组的数组、散列的数组、数组的散列等等.

创建引用



(1) 反斜杠操作符

可以用反斜杠创建一个指向任何命名变量或者子例程的引用.

my $scalarref = \$foo;
my $constref  = \186_282.42;
my $arrayref  = \@ARGV;
my $hashref   = \%ENV;
my $coderef   = \&handler;
my $globref   = \*STDOUT;

(2) 匿名数据

上述例子中, 反斜杠操作符只是简单地赋值了已经存在于一个命名变量上的一个引用. 但是有一个例外, 186_282.42 不是一个命名变量的引用, 它只是一个数值. 它就是匿名引用.

匿名引用物只能通过引用来访问. 也可以创建匿名数组、散列和子例程.

[1] 匿名数组组合器

可以用中括号创建一个指向匿名数组的引用.

my $arrayref = [1, 2, [‘a‘, ‘b‘, ‘c‘]];

这个例子组合成了一个有三个元素的匿名数组, 该数组的最后一个元素是指向三个元素的一个匿名数组.

对数组的引用, 它的第三个元素自身就是一个数组引用.

[2] 匿名散列组合器

可以使用大括号创建一个指向匿名散列的引用.

my $hashref = {
    ‘Adam‘   => ‘Eve‘,
    ‘Clyde‘  => $bonnie,
    ‘Antony‘ => ‘Cleo‘ . ‘patra‘,
};

如果需要一个函数生成一个新散列然后指向它的引用, 那么有三种不同的方法.

sub hashem {        {@_} } # 发生错误返回 @_
sub hashem {       +{@_} } # 对
sub hashem { return {@_} } # 对

[3] 匿名子例程组合器

可以通过不带子例程名字的 sub 创建一个匿名子例程.

my $coderef = sub { print "Boink!\n" }; # 现在 &$coderef 打印 "Boink!"

注意分号的位置, 在这里要求用分号是为了终止该表达式. 正常的 sub NAME{} 中是不需要分号的.

(3) 对象构造器

(7) 句柄引用

dd

(8) 符号引用

dd

(9) 引用的隐含创建

dd

使用硬引用



(1) 把变量当做变量名使用

dd

(2) 把BLOCK当做变量名用

dd

(3) 使用箭头操作符

dd

(4) 使用对象方法

dd

(5) 伪散列

dd

(6) 硬引用的其他技巧

dd

(7) 闭包

dd

(8) 用闭包做函数模块

dd

(9) 嵌套子例程

dd

符号引用



dd

大括号、中括号和引号



(1) 引用不能当做散列键用

dd

(2) 垃圾回收、循环引用和若引用

dd

时间: 2024-10-19 05:59:59

perl 引用的相关文章

[Perl系列—] 2. Perl 中的引用用法

Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发者来说, 指针这个概念一定不陌生. Perl 的引用就是指针,可以指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为硬Perl引用和符号Perl引用.符号Perl引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号Perl引用就象文件名或UNIX系统中的软链接.而硬Perl引用则象文件系统中的硬链接. Perl4只允许符号Perl引用,给使用造成一些困难.例如,只允许通过名字对包的符号名哈希表(名为_

Perl 教程

Perl 教程PerlPerl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言".Perl 是高级.通用.直译式.动态的程序语言.Perl 最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表.Perl 借用了C.sed.awk.shell脚本以及很多其他编程语言的特性.Perl 最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN.谁适合阅读本教程?本教程

perl 函数返回hash引用

perl 函数返回hash引用 my %h=%{foo()} #接收hash sub foo{ my %fh; $fh{a}=1; return \%fh;      #返回hash引用 } grep?? 在hash中,当检验一个元素值是否被定义是用defined,当检验一个key在hash中是否存在时,用exists. if(defined $hash{$key}){...} if(exists $hash{$key}){...} 正则匹配时,=~之间不能有空格!!! 一个句柄可以多次使用,但

perl 中的引用

perl 语言中的引用共分为两类: 声明引用时只需要在对象的前面加上反斜杠 第一列是数组的引用: 代码示例: my @array = (1, 2, 3); my $array_ref = \@array; 第二种是哈希的引用 代码示例: my %hash = (1, 2, 3, 4); my $hash_ref = \@hash; 通过引用去访问对应的值,通过 -> 操作符 数组的引用, 通过 [ ] 中括号 加上对应的下标,代码示例: my @array = (1, 2, 3); my $ar

【转载】Perl中的引用

为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USAFrankfurt, GermanyBerlin, GermanyWashington, USAHelsinki, FinlandNew York, USA 我们想要按国家将城市分类,每个国家后面对应城市列表,如果用perl4来做,必须将城市列表组合成字符串才行,如果用perl5就可以用引用来做,有了引用,就可以构造复杂的ha

Perl子程序引用和匿名子程序

子程序也有引用,也有匿名子程序.假设你已经具备了数组.hash的引用知识,所以这里简单介绍一下. $ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{$ref_sub}(ARGS) # 解除子程序引用,传递参数ARGS &$ref_sub(ARGS) # 解除子程序引用 $ref_sub->(ARGS) # 解除子程序引用 $ref_sub->() # 传递空参数 sub {...}; # 定义匿名子程序,sub后面没有名称 $ref_

Perl正则表达式引用

正则表达式两篇: 基础正则 Perl正则 本文是对Perl正则的一点扩展,主要内容是使用qr//创建正则对象,以及一些其它的技巧. qr//创建正则对象 因为可以在正则模式中使用变量替换,所以我们可以将正则中的一部分表达式事先保存在变量中.例如: $str="hello worlds gaoxiaofang"; $pattern="w.*d"; $str =~ /$pattern/; print "$&\n"; 但是,这样缺陷很大,在保存

Perl中的真与假

Perl认为真值是自明的(self-evident), 表示任何事物的真值都可以计算.Perl以实用的方式来定义真值,即一个实体的真值取决于这个实体的类型.Perl总是乐观的认为:这个世界上真的东西远比假的东西多的多. Perl区别与任何其他计算机语言,Perl是语言学家创造的,而语言的意思离不开上下文语境,所以Perl中的真值都可以在标量(标量$与数组@类似于英文中的单数与复数, book 与 books的区别, 真值在现实世界中,应该就是单数,所以是标量)计算,除此之外,不会做任何类型的强制

[perl] 连接mysql

先写在这里吧,之后再改进~~ package mysql_conn; use DBI; use strict; sub new{ my $class = shift(); print ("CLASS=$class\n"); my $self={}; $self->{"location"} = shift(); $self->{"db_name"} = shift(); $self->{"db_user"} =