perl中的sub(zz)

本文深入讲解Perl语言中子程序(sub)的定义与使用方法,包括参数传递、局部变量的作用域及初始化技巧,以及如何正确返回值。
基本sub格式
sub subname{             
local ($filevar) = @_;           
local ($s1, $s1); 
...

  }  
&subname;                     调用加&
do my_sub(1, 2, 3);    另一种调用方式:do调用
等价于&my_sub(1, 2, 3);

 
     sub中局部变量的定义有两种方法:my和local。
my($scalar) = 43;
my定义的变量只在该子程序中存在;(在PERL4中没有my)   
local(@array) = (1, 2, 3);
而local定义的变量不仅存在于该子程序中,还存在于该子程序调用的子程序中
 

   local($i,$wildmask)=0; 等于只初始化了一个值。
应该local($i,$wildmask)=(0,0);

    sub中三种变量的应用例子
#!/usr/bin/perl

&gotest;
print "---------------main--------------------\n";
print "\$glo is:",$glo;
print "\$local is:",$local;
print "\$my is:",$my;
print "\n";

sub gotest{
print "---------------sub gotest--------------------\n";

$glo="glo\n";
sub中使用不用local 和my而直接定义的变量,必然是全局变量或上级变量
local($local)="local\n";
my($my)="my\n";

print "\$glo is:",$glo;
print "\$local is:",$local;
print "\$my is:",$my;

print "\n";
&subgotest;
}


sub subgotest{

print "---------------sub subgotest-----------------\n";
print "\$glo is:",$glo;
print "\$local is:",$local;
print "\$my is:",$my;
sub中使用不用local 和my而直接定义的变量,必然是全局变量或上级变量
print "\n";

}
[macg@localhost perltest]$ ./tip.pl
---------------sub gotest--------------------
$glo is:glo
$local is:local
$my is:my

---------------sub subgotest--------------------
$glo is:glo
$local is:local
$my is:
local可以传给下层子sub,my是真正的“局部变量,只在当前sub内使用


---------------main--------------------
$glo is:glo
不用local和my定义的sub变量是全局变量,在所有地方都能使
$local is:$my is:    


   不用local,my而直接定义的变量,可以用在任何地方,存活时间等于程序运行时间,其实就是全局变量,所以建议少用。还是经常用local和my                                                                                             

    perl 真正的全局变量,用our,其实不用local和my的都是全局变量
our @int_name;
our @int_address;
our $int_num=0;


   不要把my用在while语句里,要提前用
while (my($line)=<MYFILE>) {
 print $line;
   }
[macg@localhost perltest]$ ./tip.pl
total 16 
只显示一行,为什么?
因为等于每次循环都初始化一次变量。
 
my($line);
while ($line=<MYFILE>) {
 print $line;
   }
[macg@localhost perltest]$ ./tip.pl
total 16
-rw-rw-r--  1 macg macg   6 Mar 16 13:06 gogo
-rwxrwxr-x  1 macg macg 195 Mar 17 17:22 tip.pl  


    最基本的sub参数传递--------实际是将参数@_赋值给局部变量

    sub参数 的两种表示方式:
整体形式(数组形式)             @_   
单独形式(数组元素形式)        $_[ ]
#!/usr/bin/perl
&gotest("stringgogo",1,3,"4test");

sub gotest{
local($tmp1,$tmp2,$tmp3,$tmp4)=@_;
或my(@tmp)=@_;

print "no.1 para is ",$tmp1,"\n";
print "no.2 para is ",$tmp2,"\n";
print "no.3 para is ",$tmp3,"\n";
print "no.4 para is ",$tmp4,"\n";

 
 #!/usr/bin/perl
&gotest("stringgogo",1,3,"4test");

sub gotest{


print "no.1 para is ",$_[0],"\n";
print "no.2 para is ",$_[1],"\n";
print "no.3 para is ",$_[2],"\n";
print "no.4 para is ",$_[3],"\n";

}
[macg@localhost perltest]$ ./tip.pl
no.1 para is stringgogo
no.2 para is 1
no.3 para is 3
no.4 para is 4test
[macg@localhost perltest]$ ./tip.pl
no.1 para is stringgogo
no.2 para is 1
no.3 para is 3
no.4 para is 4test

 
   传送数组到sub 中的数组变量
#!/usr/bin/perl
@go=qw(a b cc dd);
&gotest(@go);

sub gotest{
my(@tmp)=@_;
foreach (@tmp) {
 print $_,"\n";
   }
 
[macg@localhost perltest]$ ./tip.pl
a
b
cc
dd); 

 
    sub返回值,两种方式
最后一条语句的最大值
return语句,直接返回
#!/usr/bin/perl

@go=qw(a b cc dd);
$ret=&gotest(@go);
print $ret,"\n";

sub gotest{
my(@tmp)=@_;

9;
}
#!/usr/bin/perl

@go=qw(a b cc dd);
$ret=&gotest(@go);
print $ret,"\n";

sub gotest{
my(@tmp)=@_;

return 9;
}
[macg@localhost perltest]$ ./tip.pl
9
 [macg@localhost perltest]$ ./tip.pl
9

   
      sub 传参传字符串
1。可以传入字符串
2。可以return 字符串
#!/usr/bin/perl -w

sub test
{
local($a)=@_        
local($retstring);

 if($a eq "mac"                
  {
   $retstring="hahaha";
   return $retstring; 
   }
 if($a eq "macg")
  {
   $retstring="hahaha+ggg";
   return $retstring;
   }

}

$ret=&test("mac");
print $ret,"\n";
$ret=&test("macg");
print $ret,"\n"
[root@nm testpl]# ./tip.pl
hahaha
hahaha+ggg


 
### `sub` 关键字的作用 在 Perl 中,`sub` 关键字用于定义子例程(即函数)。它允许开发者将一段代码封装成可重用的单元,并通过名称调用。这种方式提高了代码的模块化程度和可维护性。使用 `sub` 定义的函数可以在程序的任何位置被调用,前提是该函数已经被声明或定义[^4]。 ### `sub` 的使用方法 `sub` 的基本语法如下: ```perl sub subroutine_name { # 函数体 } ``` 调用子例程时,可以通过以下几种方式: - 使用函数名直接调用(如果函数已预声明): ```perl subroutine_name(); ``` - 使用 `&` 符号调用: ```perl &subroutine_name(); ``` - 不带括号调用(如果函数已预声明): ```perl subroutine_name; ``` 例如: ```perl sub fun_say_hello { print "hello,world!\n"; } fun_say_hello; # 调用函数 &fun_say_hello; # 使用 & 符号调用 fun_say_hello(); # 使用括号调用 &fun_say_hello(); # 使用 & 符号和括号调用 ``` ### 传递参数 在 Perl 中,子例程的参数是通过 `@_` 数组传递的。该数组包含了调用函数时传入的所有参数。可以通过解包 `@_` 来获取参数: ```perl sub fun_say_hello_with_name { ($name) = @_; print "hello,$name!\n"; } fun_say_hello_with_name("Tom"); # 传递参数 ``` ### 传值和传引用 Perl 的子例程参数传递默认是按引用进行的。这意味着如果在子例程中修改了参数的值,原始变量也会受到影响。可以通过以下方式实现传值和传引用: - **传值**:将参数的副本传递给子例程,不会影响原始变量: ```perl sub fun_change_name1 { ($fname) = @_; $fname = "Jack"; } $name = "Tony"; fun_change_name1($name); # 传递值 print "$name\n"; # 输出 "Tony" ``` - **传引用**:将参数的引用传递给子例程,可以直接修改原始变量: ```perl sub fun_change_name2 { @_[0] = "Jack"; } $name = "Tony"; fun_change_name2($name); # 传递引用 print "$name\n"; # 输出 "Jack" ``` ### 返回值 Perl 子例程可以通过 `return` 语句返回值。如果没有显式使用 `return`,子例程将返回最后一个执行的表达式的值: ```perl sub check_login { ($name) = @_; if ($name eq "Tony") { return "welcome\n"; } else { return "sorry\n"; } } print check_login("Tony"); # 输出 "welcome" print check_login("Jack"); # 输出 "sorry" ``` ### 预声明子例程 为了在调用子例程之前不需要使用 `&` 或括号,可以使用 `sub` 进行预声明。这样可以在不加 `&` 或括号的情况下直接调用子例程: ```perl sub fun_say_hello; # 预声明 fun_say_hello; # 直接调用 sub fun_say_hello { print "hello,world!\n"; } ``` 此外,`sub` 还可以用于覆盖内建的 Perl 函数: ```perl sub substr { print "This is my custom substr function\n"; } substr(); # 调用自定义的 substr 函数 ``` ### `sub` 的优势 使用 `sub` 定义子例程可以提高代码的可读性和可维护性。通过将代码封装成函数,可以实现代码的重用和模块化,减少重复代码的编写。同时,预声明子例程可以简化函数调用的语法,使代码更加简洁。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值