设为首页 收藏本站
查看: 1128|回复: 0

[经验分享] perl的引用和->

[复制链接]

尚未签到

发表于 2015-12-26 08:17:31 | 显示全部楼层 |阅读模式
    常见数据类型的引用定义:
  数据类型           定义      举例
  标量变量           \$Var                              $Pointer  =  \$Var
  数组                 \@Array                          $Pointer  =  \@Array
  哈希变量           \%Hash                           $Pointer  =  \%Hash
  文件句柄           \*FILEHANDLE                $Pointer  =  \
  常量                 \常量                               $Pointer  =   \3.1415926
  子程序              \&SubRoutine                  $Pointer  =   \&SubRoutine
  匿名数组            [ LIST ]                            $Pointer  =  [  “Smith”,“Jack”,“Jimmy”,“ZhaZha”]
  匿名哈希变量     { Key=>Value }                $Pointer  = {  Key1=>Value1,Key2=>Value2}
  匿名子程序        sub {}                               $Pointer  =  sub { printf(  “Hello,Perl World\n”);}
  对象引用           bless  $self;

  


翻译自:
http://www.thegeekstuff.com/2010/06/perl-array-reference-examples/
http://www.thegeekstuff.com/2010/06/perl-hash-reference/

reference是另一个变量的地址。reference可以指向array,hash,或perl代码段。reference使perl代码运行更快。
一 array的reference和dereference  
  1)array的reference
正常地,我们存储list的元素在array中如下:@array =  (“one”,”two”,”three”,”four”,”five”);
使用\来将array的地址赋给reference变量,如下:$array_ref = \@array;
如果你print $array_ref,将显示如下:ARRAY(0x1a2b3c);
array的reference可以被传递给subroutine,如下:
sub add_numbers
{
  my $array_ref =  shift;
  .....
}  
@numbers = (11,2,3,45);
$array_ref = add_numbers(\@numbers);
在以上的代码中,我们需要对array的reference进行dereference,然后才可以使用array中的元素。
下面是传递array的reference到subroutine的优点:
* 如果array传递给subroutine,perl将整个array重新copy到@_中,当array比较大时,这将非常的低效。
* 当我们需要在subroutine中修改原来的array的时候,我们需要传递array的reference。
* reference其实是构造复杂数据结构的本质。
我们也可以将匿名的array赋给reference如下:$array_ref = [ 11,2,3,45]
2)array的reference的dereference
在subroutine中,我们可以使用如下的方法来dereference array的reference:@{ $array_ref };
取得第一个元素如下:$ { $array_ref }[0];
或者可以使用perl的特殊符号来使用array的reference,如下:
# Get all the elements of @numbers array.
@ { $_[0] }
# Get a particular element. This gives the first element of the array.
$ { $_[0] } [0]
注意,如果只是dereference一个简单的scalar变量,可以忽略括号,如下:
@$array_ref  # same as @{ $array_ref }
$$array_ref  # same as $ { $array_ref }
$_[0]         # not a simple scalar variable and this cant be dereferenced,

二 hash的reference和dereference

  hash的reference和dereference与array的一样。
hash的reference如下:
%author = (
'name'              => "Harsha",
'designation'      => "Manager"
);
$hash_ref = \%author;
dereference后访问元素如下:
$name = $ { $hash_ref} { name }; 等价于 my $name =  $hash_ref->{name};
访问所有的keys如下:
my @keys = keys % { $hash_ref }; 等价于my @keys = keys %author;
如果是简单scalar变量,可以忽略括号,如下:my @keys =  keys  %$hash_ref; $name = $$hash_ref{name};
匿名hash的reference如下:
my $hash_ref  =  {
'name'               => "Harsha",
'designation'       => "Manager"
};
使用如下:$name = $ { $hash_ref} { name };
三 对reference变量使用-> 来获得属性

  my $name =  $hash_ref->{name};

完!
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156389-1-1.html 上篇帖子: AWStats是一个基于Perl的WEB日志分析工具。 下篇帖子: Perl字符贪吃蛇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表