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

[经验分享] Learning Perl 2-debugoo

[复制链接]

尚未签到

发表于 2018-9-1 06:19:12 | 显示全部楼层 |阅读模式
  1.子程序
  1).创建子程序:使用关键字sub
  sub marine {
  print "Hello, world\n";
  }
  calling subroutines,使用&号
  &marine
  (2).返回值:所有的子程序最后一个表达式的运算结果都当作返回值。所以子程序只有“”有用返回值“和无用返回值之分。所以让一个类似print的函数的结果来充当返回值十分糟糕。比较合适的是最后一行有个if分支。
  (3).参数
  调用的时候加上列表表达式就行。例如&max(10, 15)。多余的变量都会被忽略,超过数组@_边界的变量将会是undef。
  Perl在子程序中用@_数组存储参数。第一个参数是$_[0],第二哥存储在$_[1]...
  注意:这些变量仅是数组@_的一部分,与标量$_无关。这和任意变量$arr与@arr,$arr[0]无关的道理一样。
  sub max {
  if($_[0] > $_[1]) {
  $_[0];
  } else {
  $_[1];
  }
  }
  @_是子程序的私有变量,如果有了一个全局变量@_,调用前会先被存起来,并在子程序返回时恢复原本的值。
  (4).Perl子程序的参数的传递是按引用传。
#!/usr/bin/perl -w sub marine{        $_[0]=&quot;sub1&quot;;        $_[1]=&quot;sub2&quot;;} $m=&quot;out1&quot;;$n=&quot;out2&quot;;print marine($m,$n).&quot;\n&quot;;print &quot;$m\n$n&quot;;则会输出sub2sub1sub2(5).由于perl的子程序参数是可变长度的参数列表,可以用if来检查if(@_ != 2) {print &quot;WARNING, this subroutine should get exactly two parameters!\n&quot;}  块的最后一条语句可以省略;号。无论在控制结构的块还是在子程序的块中。(6).return $_;立即返回某个值。(7).何时可以省略调用子程序时的&:当定义在调用之前,或者用()来传递参数时就可以省略&(8).返回非标量值,最后一行为列表即可sub marine{#...reverse 1..10;}(9).采用高水位标记算法来处理任意数量参数的maxprint &max(3,5,6,1,2,12);#或者直接传入一个列表#@numbers=(3,5,6,1,2,12);#print &max(@numbers);sub max {        my($max_so_far)=shift @_;        foreach (@_) {                if($_ > $max_so_far) {                        $max_so_far=$_                }        }        $max_so_far}2.perl范围声明our,&quot;把名字限于某个范围“,其实就是明确声明一个&quot;全局变量&quot;,虽然是在某个模块或者函数里面定义的,外面的也可以访问,如果已经声明过了,再次用&quot;our&quot;,表示此处用的是全局的那个,不是同名的私有或者局部变量 our $PROGRAM_NAME = &quot;waiter&quot;;{my  $PROGRAM_NAME = &quot;something&quot;;our $PROGRAM_NAME = &quot;server&quot;; #这里的our和外面的相同,和前句不同。# 这里调用的代码看到的是&quot;server&quot;}# 这里执行的代码看到的仍然是&quot;server&quot;. my ,&quot;把名字和值都限于限于某个范围&quot;,简单说,就是只能本层模块或者函数可以看到这个变量,高一层的或者低一层的都看不到的。sub greeting1{    my ($hello) = &quot;How are you do?&quot;;    greeting2();} sub greeting2{    print &quot;$hello\n&quot;;}$hello = &quot;How are you doing?&quot;;greeting2();greeting1();greeting2();运行结果:How are you doing?How are you doing?How are you doing?--------------------------一个 How are you do? 都没有,在greeting1中call greeting2时,greeting2看不到greeting1的私有 $hello变量,只能看到外面的全局变量$hello local,&quot;把值局限于某个范围&quot;,也有叫&quot;动态词法范围&quot;,有点不好懂。我的理解,就是本层和本层下层的函数可以看到本层的变量,但是本层上一层的不可以。到底范围是多少,不仅取决于本层的函数,还要看下一层的程序长度和深度,所以叫&quot;动态范围&quot;。sub greeting1{    local ($hello) = &quot;How are you do?&quot;;    greeting2(); }sub greeting2{    print &quot;$hello\n&quot;;}$hello = &quot;How are you doing?&quot;;greeting2();greeting1();greeting2();运行结果:How are you doing?How are you do?How are you doing?-----------------------跟用 my 时不一样了吧? 此时在greeting1调用greeting2时,greeting2可以看到greeting1的局部变量$hello,外部的全局变量当然就隐藏了。 范围操作符不会改变变量赋值时的上下文。例如my($num)=@_;#列表上下文,等同于($num)=@_,$num是第一个元素的值my $num=@_;#标量上下文,等同于$num=@_,$num是列表的长度 3. 使用use strict;强制使用一些良好的程序规范,例如不能操作未初始化的变量。可以有效防止变量名打错的情况。 4. 钻石操作符钻石操作符是perl的读取文件(文件名通过参数传入,即@ARGV数组。如果@ARGV为空,则改用标准输入流)每一行的操作符,让perl程序也能像cat,sed等应用程序直接处理文本文件。是一个整行输入操作符的特例。#!/usr/bin/perl -w while (defined ($line=)){       chomp ($line);       print &quot;$line\n&quot;;}或者简写成while () {chomp;print &quot;$_\n&quot;;} print  ;   cat 的perl实现,print sort  ; sort的perl实现 的另一个例子,通过打开的文件描述符open(HANDLE,&quot;c:/test.txt&quot;)   or   die   &quot;文件不能打开&quot;;    while   ()             #注:这就是对文件句柄读取一行并存入变量   $_   {   print;                                 #注:打印变量   $_   } 5.输出至标准输出print注意:print (2+3)*4;会打印5,然后print的返回值1(成功)会被乘以4. 小心这种带括号的操作符用法。printf和C语言的printf类似,%g是输出恰当的数值形式。自动输出整数,浮点数和指数形式。例如5/2, 51**17会输出2.5,1.0683e+29生成格式字符串my @items=qw(wilma dino pebbles)my $format=&quot;The items are:\n&quot;.(&quot;%10s\n&quot; x @items)#使用x来复制字符串,@items为3,即“%10s\n”三遍printf $format, @items 6.文件句柄(1).打开文件句柄通常文件句柄用大写标识。Perl提供3种文件句柄:STDIN STDOUT STDERR由Perl的父进程(可能是Shell)提供。当使用其他的文件句柄时,使用open操作符告诉Perl。例如: open CONFIG,&quot;dino&quot;open CONFIG,&quot;fred&quot;#如果已经有一个文件存在,则清楚原有内容并以新内容取代之open LOG,&quot;>>LogFile&quot;#如果不存在,则创建。如果存在,则追加检测文件句柄的有效性my $success=open LOG,“>>logfile”unless ($success) {#open失败}比如可以直接使用die中止运行或者warning送出警告信息。perl程序的exit status:0成功,1语法错误,2处理某程序发生错误,3可能找不到某个细节配置文件等if(!open LOG, &quot;>>logfile&quot;) {warning &quot;can not create file&quot;}if(@ARGV < 2)die &quot;Not enough arguments.\n&quot;另:open CONFIG, &quot;logfile&quot; or die &quot;not such file&quot;;关闭文件描述符:close LOG (2).使用文件句柄print LOG “...”;printf STDERR &quot;...&quot;;open PASSWD, &quot;/etc/passwd&quot;or die &quot;cannot open passwd file&quot;while () {chomp;......}或者放到列表里open PASSWD, '

运维网声明 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-560146-1-1.html 上篇帖子: 简单统计vss和rss总值的perl脚本 下篇帖子: perl语言入门(3)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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