您的位置:首页 > 其它

Perl函数及参数介绍

2012-05-03 09:57 204 查看
子例程,函数
  子例程,函数的作用域是指在程序中能够看到它的位置范围。子例程是全局的,可以放在脚本中的任意位置,甚至放在其他脚本文件中。当使用来自其他文件的子例程时,应当使用关键字do,require或use将它加载到脚本里。若要调用一个子例程,用户可以在子例程前加上&符号,或在子例程前加上do关键字,也可以在子例程名后面加上一组括号。如果使用了向前引用(forward reference),在调用子例程时就不需要提供&或括号。

Subroutine declaration:
sub subroutine_name;
Subroutine definition:
sub subroutine_name{ Block }
Subroutine call:
do subroutine_name;
&subroutine_name;
subroutine_name();
subroutine_name;
Subroutine call with parameters:
&subroutine_name( parameter1,parameter2,.......);
subroutine_name( parameter1,parameter2,.......);


示例代码:

#!/user/bin/perl

sub greetme
{
print "Welcome,Valkommen till,Bienvenue!\n";
}

&greetme if defined &greetme; #使用defined函数检查子例程是否已经定义。在使用子例程名时,要求必须提供&标记。

print "Program continues ....\n";

&greetme;

bye();
&bye;
#bye;   此种方式调用需使用向前引用,类似C程序中的声明。
sub bye;
bye;

sub bye
{
print "Bye,adjo,adieu.\n";
}

bye();
&bye;
bye;


运行结果:

Welcome,Valkommen till,Bienvenue!
Program continues ....
Welcome,Valkommen till,Bienvenue!
Bye,adjo,adieu.
Bye,adjo,adieu.
Bye,adjo,adieu.
Bye,adjo,adieu.
Bye,adjo,adieu.
Bye,adjo,adieu.


参数传递
  函数把接收到的参数保存到特殊的perl数组@_中,其中每个元素($_[0],$_[1],.....)称作一个参数。不论参数是标量型还是数组型的,用户把参数传给子例程时,perl默认按引用的方式调用它们。用户可以通过改变@_数组中的值来改变相应实际参数的值。

示例代码:

#!/usr/bin/perl

sub params
{
print 'The values in the @_array are ',"@_\n";#将打印整个数组
print "The first value is $_[0]\n";
print "The last value is ",pop(@_),"\n";#最后一个参数被弹出@_数组,实际参数的个数并未改变

foreach $value (@_)
{
$value+=5;
print "The value is $value","\n";
}
}

@n=(1,2,3,4,5);
params(@n);
print "Black in main\n";
print "The new values are @n \n";


运行结果:

The values in the @_array are 1 2 3 4 5
The first value is 1
The last value is 5
The value is 6
The value is 7
The value is 8
The value is 9
Black in main
The new values are 6 7 8 9 5 #前四个参数值已经改变,最后一个参数值没有发生变化,因为子例程中执行了pop(@_).


local与my区别
  任何使用local函数声明的变量都是动态拷贝的。该变量不但在创建它的块中可见,而且对于任何从该代码块调用的函数中也是可见的。与local函数声明的变量不同,my函数声明得到的所有变量都只在声明它的子例程中可见,对于该子例程调用的任何其他子例程都是不可见的

  内部->外部

    1)my和local都只在一个block里有效,出去就失效;

    2)但是local的变量可以继续在这个block中调用的子程序中存在;

    3)如果有与外界同名的变量,两者在block退出后都不影响外界同名变量;

  外部->内部

    如果在一个block中有一个my修饰的变量和外界的一个变量同名,而且又需要在这个block中使用外界变量时,两个办法:第一个办法,用main的package修饰这个变量名,$main::global。第二个办法,用our修饰,our $global,那么该block中接下来出现的所有$global都是外界的global

示例代码:

#!/usr/bin/perl
$x = 9;
sub mm{
print "$x\n";
}
sub gg_my{
my $x = 11;
print "call-my $x\n";
our $x;
print "our-global $x\n";
mm;
}
sub gg_local {
local $x = 20;
print "call-local $x\n";
mm;
}
gg_my;
gg_local;
print $x;


运行结果:

call-my 11
our-global 9
9
call-local 20
20
9


创建指针和访问指针地址

赋值 创建引用访问地址使用箭头运算符访问地址
$sca = 5$p=\$scaprint $$p
@arr=(4,5,6)$p=\@arrprint @$p$p->[0]
print $$p[0]
%hash=(key=>'value') $p=\%hash print %$p$p->{key}
print $$p{key}
指针参数

  当一个子例程接收参数时,便会把参数保存到@_数组中。当把两个数组同时传递给一个子例程时,这两个数组都将保存到@_数组中,并连接成单个列表。如果不知道其中前一个数组长度的话,基本上就不可能再拆开这两个数组了。不过,如果传递给子例程的是两个指针,分别含有这两个数组地址的话,就可以方便地实现数组内容的分离。

示例代码:

#!/usr/bin/perl

my @list1=(1..100);
my @list2=(5,10,15,20);

print "the total is :" ,&addemup(\@list1,\@list2),".\n";

sub addemup
{
my( $arr1,$arr2) =( shift,shift);# The two pointers are  shifted from @_

my $total=0;
print $arr1,"\n";
print $arr2,"\n";

foreach $num(@$arr1,@$arr2)
{
$total+=$num;
}
$total; #相当于 return $total;
}


执行结果:

ARRAY(0x182a944)
ARRAY(0x183728c)
the total is :5100.


文件句柄的引用

示例代码:

#!/usr/bin/perl

open( README,"D:\\perlwork1\\perl.pl") || die;

&readit(\*README);#reference to a typeglob

sub readit
{
my ($passwd)=@_;
print "\$passwd is a $passwd.\n";
while(<$passwd>)
{
print;
}
}


执行结果:

$passwd is a GLOB(0x182a964).
#!usr/bin/perl
。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: