perl自学笔记整理(三)

关于perl中的子程序

1、定义子程序
sub sub_programe_name {
    程序语句体; 
}

2、调用子程序

&sub_programe_name;

3、子程序的返回值
在子程序的执行过程中,它会不断进行运算。而最后一次运算的结果(不管是什么),都会被自动当成子程序的返回值。
[[email protected] fuxi]# cat a4.pl 
#!/usr/bin/perl
#subroutine
sub sum_of_fred_and_barney {
print "Hey , you called the sum_of_fred_and_barney subroutine!\n";
 $fred + $barney;  #这是该子程序的最后一次运算,其结果将成为本子程序的返回值。
}
($fred, $barney) = qw( 3 4 );
$wilma = &sum_of_fred_and_barney;
print "\$wilma is $wilma.\n";
$betty = 3 * &sum_of_fred_and_barney;
print "\$betty is $betty.\n";
[[email protected] fuxi]# perl a4.pl 
Hey , you called the sum_of_fred_and_barney subroutine!
$wilma is 7.
Hey , you called the sum_of_fred_and_barney subroutine!
$betty is 21.

4、向子程序中传递参数

$n = &max(10, 15);        #包含两个参数的子程序调用

参数列表将会被传入子程序,让子程序随意使用。当然,得先将这个列表存在某处,Perl会自动将参数列表化名为特殊的数组变量@_ , 改变量在子程序执行期间有效。子程序可以访问这个数组,以判断参数的个数以及参数的值。 @_ 变量是子程序的私有变量。假如已经有了全局变量@_ , 则该变量在子程序调用前会先被存起来,并在子程序返回时恢复原本的值。
这表示子程序的第一个参数存储于$_[0],第二个参数存储于 $_[1],依次类推。

5、长度可变的参数列表
例如:求任意数中的最大值
[[email protected] ccc]# cat test.pl 
#!/usr/bin/perl
#test
$max_num = &max( 1, 11, 11, 15, 7, 10 );
sub max {
my $num_max = shift @_;
foreach (@_) {
if ( $_ > $num_max ) {
$num_max = $_;
}
}
$num_max;
}
print "The max number is : $max_num\n";
[[email protected] ccc]# ./test.pl 
The max number is : 15
例如二:求任意数的最小值
[[email protected] ccc]# cat test.pl 
#!/usr/bin/perl
#test
$max_num = &max( 1, 11, 11, 15, 7, 10 );
sub max {
my $num_max = shift @_;
foreach (@_) {
if ( $_ < $num_max ) {
$num_max = $_;
}
}
$num_max;
}
print "The min number is : $max_num\n";
[[email protected] ccc]# ./test.pl 
The min number is : 1

6、关于词法my变量
my $aaaa= *****;    #不在任何语句块中的my管全局变量

foreach (@bbbbb) {
-----------
-----------
my $ccccc;        #在语句块中的my变量只对当前语句块生效,跳出后就恢复原有。
}
my($num) = @_;        #列表上下文, 和 ($num) = @_; 相同
my $num = @_;     #标量上下文, 和 $num = @_; 相同

my $fred, $barney;        #错! 没声明 $barney
my ($fred, $barney);    #两个都声明了。

my @new_number;        #你也可以用my来创建新的私有数组;所有新变量的值一开始都是空的:标量被设为undef, 数组被设为空列表。

7、return操作符
return操作符会从子程序中立即返回某个值,而不再执行子程序的其余部分。
例如:

[[email protected] ddd]# cat test12.pl 
#!/usr/bin/perl
#test12
my @test = qw( beijing shanghai guangzhou shenzhen );
my $result = &aa( guangzhou, @test);
sub aa {
my ($what, @array) = @_;
foreach (0..$#array) {
if ($what eq @array[$_]) {
return $_;            #如果找到下标值就立即返回$_的值;
}
}
-1;        #其实这里的-1等同于return -1; 不过在此程序员省略了而已。
}
print "guangzhou 的下标值是: $result \n"  
[[email protected] ddd]# ./test12.pl
guangzhou 的下标值是: 2

8、子程序中的非标量返回值,比如返回一个列表值。
例如:
[[email protected] ddd]# cat test13.pl 
#!/usr/bin/perl
#test13
sub max_to_min {
$fred = 16;
$barney = 10;
if ($fred < $barney) {
reverse $fred .. $barney;
}else{
reverse $barney .. $fred;
}
}
@cc = &max_to_min;
print "@cc\n";
[[email protected] ddd]# ./test13.pl 
16 15 14 13 12 11 10

9、持久性私有变量--state
在子程序中可以使用my操作符来创建私有变量,但每次调用这个子程序的时候,这个私有变量都会被重新定义。使用state操作符来声明变量,我们便可以在子程序的多次调用间保留变量的值,并将变量的作用域局限于子程序中。
[[email protected] ddd]# cat test14.pl 
#!/usr/bin/perl
#test14
use 5.010;            #此处特别注意,如果不用5.10版,会导致state @numbers;行报错!!
&running_sum( 5, 6 );
&running_sum( 1..3 );
&running_sum( 4 );

sub running_sum {
state $sum = 0;
state @numbers;
foreach my $number ( @_ ) {
push @numbers, $number;
$sum += $number;
}
print "The sum of (@numbers) is $sum\n";
};
[[email protected] ddd]# ./test14.pl 
The sum of (5 6) is 11
The sum of (5 6 1 2 3) is 17
The sum of (5 6 1 2 3 4) is 21

时间: 2024-08-07 17:02:29

perl自学笔记整理(三)的相关文章

perl自学笔记整理二

开篇:如果说perl世界里,标量指的是单数的话,那么复数指的就是列表和数组. 列表指的是标量的有序集合:数组则指的是存储列表的变量:无论列表还是数组都可以包含无数多个元素. 一)访问数组中的元素 1) 访问数组中的元素 例如:[[email protected] fuxi]# cat a1.pl #!/usr/bin/perl#a1$fred[0] = "yabba";        #将值yabba赋值给数组$fred的第零个元素$fred[0] ;$fred[1] = "

perl自学笔记整理

输入与输出 1.读取标准输入(键盘输入的形式都称标准输入)$line = ;                #读取下一行chomp($line);                    #截掉最后的换行符 chomp($line = );    #习惯用法,效果同上如果读到文件结尾(end-of-file), "行输入"操作符就会返回undef.这样的设计是为了配合循环使用,可以自然地跳出循环:while (defined($line = )) {    print "I s

Java自学笔记(三)——输入

因为最近学的内容实际操作比较多,所以新的笔记就用代码为主体吧! 本回主要内容是输入,Java中主要用Scanner类和BufferedReader.总体来说不难,但有些细节可以总结,看代码: import java.io.*; import java.util.Scanner; public class ioTest { public static void main(String[] args) throws Exception { //Scanner提供了多种构造器,不同的构造器可以接受文件

Python学习笔记整理(三)Python中的动态类型简介

Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之间的关系都适用.那么这个概念也容易理解并掌握. 1.变量,对象和引用 变量创建:一个变量,当代码第一次给它赋值时它就被创建了.之后的赋值将会改变已创建的变量名的值.Python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量. 变量类型:变量永远不会有任何的它关联的类型信息或约束.类型的概念

angular2自学笔记(三)---ng2选项卡

学习了这些概念就能简单的描述一个选项功能的选项卡按钮: 数据:1.数组:实例化一个数组的类,如果想要使用这个类中的数据,需要在组件中 使用一个公共属性来暴漏这个类如 heroes=HEROES;const 数组名HEROES:数组中数据结构=[    ] 命令指令1.*ngFor="let value of arr/json"   ==>  {{value}}2.(click)=函数名(参数) angular的模块    模板语法:https://www.angular.cn/d

jQuery自学笔记(三):jQuery动画效果

jQuery隐藏和显示: 使用 hide( ) 和 show( ) 方法来隐藏和显示 HTML 元素: 语法: $(selector).hide(speed,callback); $(selector).show(speed,callback); 可选的 speed 参数规定隐藏/显示的速度,可以取以下值:"slow"."fast" 或毫秒,可选的 callback 参数是隐藏或显示完成后所执行的函数名称. 一个关于调用callback函数的实例: $("

JAVA基础自学笔记整理(二 )某些数据类型的姿势

啊哈哈哈哈哈~刚打完三国杀,好爽,于是有看了一下视频. 有关于类型的转换,有两种:自动和硬肛(强制). 1.自动类型转换 容量小的数据类型可以自动转为容量大的数据类型. e.g int i = 3; double d = i; float f = i; double d2 = f; //直接换 不用什么硬肛的姿势. 可以直接将int常量直接赋值给byte,short,char等类型变量,而不需要强制类型转只要                不超出其表数范围. e.g byte(-128~~127

JAVA基础自学笔记整理(二 )运算符哟哈哈

嗯三国杀好好玩,不过和朋友开黑一天开的好累,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈. 这次看的视频是关于运算符的...怎么感觉有点鸡肋,不是很想画时间码字了,毕竟很多语言的运算符都一样(我只知道JAVA和C,就装个逼233) 嗯真方便,哈哈哈哈哈哈哈哈哈哈哈 再吃个图 对了布尔值的逻辑运算符是从左到右的,如果只通过左边的能确定值是多少,右边的就不用计算了(不管对错). 额.大概这么多,不过好像还有三目运算符

Flex 笔记整理 三

1. Panel, TitleWindow PopUpManager 透明 用一个类,这个类里引用一个组件, P如 Panel, TitleWindow等, 利用PopUpManager来弹出显示.    可能显示的都为透明窗体.    这时要引用从引用主主程序传进来的this (Sprite) 对象. 2. Flash Builder 保存修改构建空间 很久的问题 在FB 工具窗口的 项目菜单下,取消掉 自动构建 ,     要启动时按F11 即可,    如果运行调试时,老是只在 57% 时