blue1025的个人空间 https://blog.eetop.cn/mj8051 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

PERL 第4章 subroutine

已有 1092 次阅读| 2008-9-27 13:51 |个人分类:PERL

SOURCE HTML: http://socvista.com/bbs/redirect.php?fid=71&tid=903&goto=nextnewset

12:28 第四章 --  subroutine子程序 (1)

-- 定义子程序
sub marine {
  $n += 1;
  print "hello, sailor number $n!\n";
}

-- 子程序都是global的。

-- 调用子程序
&marine; # hello, sailor number 1!
&marine; # hello, sailor number 2!

-- 返回值
Perl将最后一个表达式的结果作为返回值。因此没有显式声明。
sub sum_of_ab {
  print "something....!\n";
  $a + $b;  # this is the return value
}
调用返回值的方法:
$sum = &sum_of_ab;
注意,最后一个表达式不要使用 print语句。如果使用了print语句则print的执行结果1(表示正常)就会作为返回值,从而造成和期望不一致。

-- 参数
Perl中所有子程序的参数都自动进入@_变量,这个变量是一个local私有的变量,出了子程序就无效了。而且不管子程序如何嵌套都不会出错,每一级都有其自身的@_。
调用参数时,采用$_[0]、$_[1]这种方式来获取第0、1个参数。

-- 子程序中的私有变量
默认情况下,变量都是global的。
用my操作符可以将变量定义成私有的,也就是只在当前的block内有效。
sub max{
  my ($m, $n);
  ($m,$n)=@_;
  if ($m > $n) {$m} else {$n};
}

-- 变量定义与初始化
my($m,$n) = @_;

13:27 第四章 --  subroutine子程序 (2)
-- 变量长度识别
由于Perl遵循“no unnecessary limits”的理念。因此参数的长度并没有限制。为此,需要在程序中做一下长度的检查。
sub max{
  if (@_ != 2) {print "Warning! &max should get exactly 2 arguments!\n"};
  # .... omitted.
}

-- 任意长度参数的处理方法
看一下这个例子,照着学一下就可以了。触类旁通,哈。
使用方法:$maximum =&max(3,4,10,5,6);
程序定义:
sub max {
  my ($max_so_far) = shift @_;
  foreach (@_) {
    if ($_ >$max_so_far) {$max_so_far = $_};
  }
  $max_so_far;
}
这里提到了对任意长度的处理方法:是用foreach循环处理掉。

-- 关于my操作符
my变量只在enclosing block有效。这个enclosing block就是包裹着my的block,可以是一个subroutine,也可以是一个foreach循环。
另外my不会改变list/scalar的context。

13:51 第四章 --  subroutine子程序 (3)
-- 使用use strict pragma
所谓 pragma是给compiler用的一种暗示指令。
由于perl过于宽松,代码一长就容易产生错误。为此,使用use strict来规范代码。
使用方法:use strict;
效果是所有变量都必须先声明再使用,一般用my来完成变量声明。
当然$_,@_这些内置变量不需声明。
一个推荐的做法是当程序长度超过一屏的时候就应该使用use strict了。

-- return 操作符
一般情况下subroutine的最后一行返回值,但是有时候需要在中间执行完后就返回值并退出。这时就可以用return语句了。和C语言类似,不再赘述。
return $_;

14:08 第四章 --  subroutine子程序 (4)
(大盘有上涨的趋势)

-- 何时可以不用& (ampersand)
这个符号是用来帮助编译器识别用户自定义subroutine的,因此如果能使编译器意识到这一点则无需&符号。情况:
1. 如果subroutine使用的时候带有参数,compiler会意识到。
2. subroutine定义在先,使用在后。
如果自己定义的函数和built-in同名,必须使用&符号加以区别。

-- 返回值可以是List类型
sub list_from_atob {
  if ($a < $b) { $a..$b }
  else {reverse $b..$a}
}


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 13

    粉丝
  • 16

    好友
  • 15

    获赞
  • 23

    评论
  • 2824

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 17:03 , Processed in 0.013190 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部