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

[经验分享] perl学习笔记(7)

[复制链接]

尚未签到

发表于 2018-8-31 11:53:56 | 显示全部楼层 |阅读模式
  开始学习函数。
  函数的返回值是最后一个表达式的值,或者是return语句显式返回的值。
  
挺有意思的,perl函数的参数不需要声明,用@_,$_[0],$_[1],$_[2],$_[3],...来引用。
  做个练习(f71.pl):
  
1)看看是传值还是传引用
  
2)顺便掌握内插函数的写法${\&Test($v1,$v2)} 。为什么需要${\}转义没明白。练习的环境是5.8.8,希望更高版本能更省事一些。
  
3)$v2传进去了,但是没使用。这说明perl在传参数这件事上还是很灵活的。
  


  • #!/usr/bin/perl -w
  • sub Test {
  •         $p1 = $_[0];
  •         $_[0]  .= " be changed.";
  •         return $p1;
  • }

  • $v1 = "abc";
  • $v2 = "efg";
  • print "Test return: ${\&Test($v1,$v2)} \n";
  • print qq(now v1=$v1\n);

  • #others' code
  • print "foo: [${ \&foo() }]\n";
  • print "bar: [@{ [&bar()] }]\n";
  • sub foo {
  •     return "single message";
  • }
  • sub bar {
  •     return ("hello", "world");
  • }
  

  $ perl f71.pl
  
Test return: abc
  
now v1=abc be changed.
  
foo: [single message]
  
bar: [hello world]
  目前我的理解是这种传参数的方式的要点在于函数是用动态长度的列表来接收参数的。这样,想一次传多个列表就要想别的办法。例如,(@a,@b)=@_;这种接收方式的结果是@a把@_全部接收了。($a,$b,@others)=@_;这样可以接收多个变量和1个列表,但是列表要放最后面。传哈希列表类似的,也要放最后面。
  吃完饭回来继续写。。。。。
  开始学习引用(指针/别名)。
  引用的语法:$ref=\$a;  这样$ref和$a就指向同一个数据块了吗?噢,使用$ref和使用$a还是有差别的。$a和$$ref返回的结果是一样的。为什么ref前面有两个$?哈哈,这下大约是捕捉到$的含义了。为了方便阅读,下面另起一段专门说说这个事。
  变量在内存中应该是由2部分组成,一部分是“名字”,另一部分是“值的位置”。如果把“值”理解为没有“名字”的变量,那么这个事情就能忽悠圆了。执行完$a="abc"; $ref=\$a;以后,内存中应该有三块了:ref(a的位置)、a("abc"的位置)、("abc"),即,ref-->a-->"abc"。\$这个符号返回的是变量的位置,$要根据位置去找下一个变量,那么$ref就不应该是("abc的位置"),而应该是(复制)ref所指向的变量或常量。因此,想得更多一些,$b=$a; 不应理解为“将a的值拷贝给b”,而应理解为“复制一份a所指向的变量,然后让b指向这个复制品(保存这个复制品的位置)”。
  通过以上讨论,不难发现要想彻底控制ref-->a-->"abc",还缺少获取变量名称的操作符。花了不少时间,得到的答案是要用到安装PadWalker模块(下次再学),网址:http://search.cpan.org/~robin/PadWalker-1.9/PadWalker.pm
  练习(f73.pl):
  


  • #!/usr/bin/perl -w

  • $a="abc";
  • print "\$a: address " . \$a . "value $a\n";
  • $b=$a;
  • print "\$b: address " . \$b . "value $b\n";
  • $ra=\$a;
  • print "\\\$ra: address " . \$ra . " value $ra\n";
  • $rb=$ra;
  • print "\\\$rb: address " . \$rb . " value $rb\n";
  • $$rb="cde";
  • print qq(after reset \$\$rb=cde a=$a b=$b \$\$ra=$$ra \$\$rb=$$rb);
  • print "\n";
  

  $ perl f73.pl
  
$a: address SCALAR(0x8c45600)value abc
  
$b: address SCALAR(0x8c45684)value abc
  
\$ra: address REF(0x8c456fc) value SCALAR(0x8c45600)
  
\$rb: address REF(0x8c45774) value SCALAR(0x8c45600)
  
after reset $$rb=cde a=cde b=abc $$ra=cde $$rb=cde
  数组引用和哈希引用同样的道理。ref-->a-->('a','b','c');
  练习(f74.pl):
  


  • #!/usr/bin/perl -w
  • @a=qw(a b c);
  • $ra=\@a;
  • %ha=(a=>"1",b=>"2",c=>"3");
  • $rha=\%ha;
  • print qq(\$\$ra[0]=$$ra[0] \@\$ra[1,2]=@$ra[1,2] \$\$rha{a}=$$rha{a});
  • print("\n");
  

  $ perl f74.pl
  
$$ra[0]=a @$ra[1,2]=b c $$rha{a}=1
  

  用{}匿名引用哈希列表,用[]匿名引用顺序列表(终于想到一个好名字“顺序列表”)。下面是代码片断:
  


  • $rh1={a=>"11",b=>"22"};
  • print $$rh1{b} . "\n";
  • $r1=["a","b","c"];
  • print $$r1[2] . "\n";
  

  打印(print)结果:
  22
  
c
  

  引用是用变量存储的,函数用列表接收参数,这样我们就能够实现用函数接收多个列表了。而且,通过引用,我们还能模拟二维列表,甚至N维数据结构。
  在给函数传递引用时,需要特别注意的是引用是可以修改原值的。一般教程中会提示说“危险”,我想这个危险应该是源自“无知”而不是“引用”本身,既然已经明白了引用,就没什么可畏惧的,带着畏惧之心更容易出错。在实践中可以增加函数的注释,注明其传递的是引用,还应注明是否对原值有修改。
  这次就到这,下次学习正则表达式和CPAN。



运维网声明 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-559340-1-1.html 上篇帖子: perl学习笔记(6) 下篇帖子: perl学习笔记(8)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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