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

[经验分享] perl的一些难以概念的概念

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-12-27 14:22:48 | 显示全部楼层 |阅读模式
  1.为什么perl的库有的是.pl的有的是.pm的?
  答:.pl是一种比较老的形式的库的形式,.pm是一种新的形式。在导入这些库的时候,.pl只能用require导入,而.pm可以用require和use两种方式导入。
  2.require 和use又什么区别?
  答:require和use的共同目的都是用来装载库的,他们有点像c语言的动态装载和静态链接之间的关系,require动态装载库,也就是在perl程序运行时才装载perl库文件,use可以理解为静态连接,也就是perl脚本在编译的时候就装载了perl库。require可以装载.pm和.pl两种库,但use只能装载.pm库。use装载.pm 的时候,会执行.pm库里面package的export方法来导入库的符号表,这样就可以不用指定package的名字,而直接调用package的方法。
  3.package 和module是什么关系?
  答:package实际上是名字空间,而module实际上是一个抽象的概念,表示提供一种功能的代码集合,一个module通常是保存在一个.pm文件里面的。一个module可以包含一个或多个package,但为了编程的方便,通常一个module文件中只包含一个package,为什么这样说了,因为在导入模块的时候,use的参数实际上是文件名,如果这个文件名指定的模块中有几个package,而这些package都继承了export class到处符号表,那么只有和文件名相同的package的export方法能够被use调用,也就是说只有和文件名相同的package的符号表才能被导出来。所以最好一个模块文件只有一个package,而且这个package要和文件名一样。
  4。my 和 our的区别
  答:our很简单,它的意义就有点像c语言的external的变量,这个变量的是放在程序的堆空间里,也就是说生存周期和程序是一样的。our的变量是放在package的符号表里面的,也就是说可以被::操作符或者export方法导出。my变量就复杂很多,如果my变量是定义在package的最上层,也就是不再任何{}块里面,那么它就有点象c语言的static变量,它的地址是分配在堆里面,生存周期也是和程序一样,但它的符号没有放到package的符号表里面,所以不能用::或export导出。如果my变量是定义在{}里面,那么它的地址就在堆栈里面,{}结束以后,就会被释放。
  5。perl实现面对对象的方式是怎么样的
  答:基本上是package+ISA数组的方式。package实现了类的封装,ISA实现了类的继承
  6.  @_到底应该怎么样理解?
  答:先看一段程序
  #!/usr/bin/perl
  my $p=1;
  sub value_replace{
  my $value = $_[0];
  $value=9;
  print "p is $p\n";
  $_[0] = 9;
  print "p is $p\n";
  foreach my $value (@_){
  $value = 20;
  }
  print "p is $p\n";
  }
  value_replace($p);
  =========
  结果是:
  p is 1
p is 9
p is 20
  以上测试结果说明了:
  1.$_[0]这个符号并不是普通意义的数组访问,而是一个特殊的符号,它是一个typeglob
  2. foreach的意义并不是把数组的值取出来,然后赋值给某一个局部变量,而是进行的符号替换
foreach my $value (@_){  $value = 20;
  }
  print "p is $p\n";
  比如上面这段代码,如果foreach是把$_[0]的值取出来,在赋值给$value局部变量,那么后面打印的p的值就应该是10,而不是20,
说明foreach在这里做的事情是符号替换(而不是数值拷贝),把value这个符号依次替换替换成_[0]这个符号的指向的地址
  7. typeglob 是什么意思?到底应该怎么用?
  答:先看个例子
  #!/usr/bin/perl
  my $a=1;
  my $a_alias=2;
  our $b=3;
  our $b_alias=4;
  *a_alias=*a;
  *b_alias=*b;
  print "a_alias = $a_alias,b_alias=$b_alias\n";
  输出的结果是:
  a_alias=2, b_alias=3
  为什么a_alias没起作用,而b_alias起作用了?
  因为typeglob实际上是对符号表的修改,在符号表增加了一个符号,和以前的符号指向同一个typeglob,my的变量是没有放在符号表的,而our的是放到符号表的,所以b_alias成功了

运维网声明 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-157005-1-1.html 上篇帖子: Installing perl and writing your first perl program in Ubuntu 下篇帖子: perl-getopts
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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