曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3913|回复: 0
打印 上一主题 下一主题

函数参数,局部(私有)变量,@_ 与 my

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-9-24 14:43:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Perl 子程序可带有参数,这些参数会存放在一个特殊的数组变量 @_ 里,该变量在子程序执行期间有效。子程序可以访问它,并藉此判断参数的个数以及参数的值。

子程序的第 1 个参数存储在 $_[0] 中,第 2 个参数存储在 $_[1] 中,以此类推。注意,这里的这些数组元素和 $_ 内置变量毫无关系!

默认情况下,Perl 中定义的变量都是全局变量,在程序里的任何地方都可以访问它们。但在子程序里可以使用私有变量,私有变量和 C 语言中的局部变量一样的道理。创建子程序的私有变量使用操作符 my 。私有变量可以和全局变量同名且不会有任何冲突。

测试代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

$i = 10;
$j = 20;
$k = 30;
$m = 40;
$n = 50;

sub subf {
        my ($i, $j, $k, $m, $n);
        ($i, $j, $k, $m, $n) = @_;

        print "$i, $j, $k, $m, $n \n";
        print "$_[0], $_[1], $_[2], $_[3], $_[4] \n";

        foreach (@_) {
                print "$_ ";
        }
        print "\n";
}

print "global variable: $i, $j, $k, $m, $n \n";

subf(22, 83, 23, 44, 55);

print "check whether global variable changed: $i, $j, $k, $m, $n \n";


运行输出:
./my.pl
global variable: 10, 20, 30, 40, 50
22, 83, 23, 44, 55
22, 83, 23, 44, 55
22 83 23 44 55
check whether global variable changed: 10, 20, 30, 40, 50



my 是词法变量 (lexical variable) ,实际上它不仅限于用在子程序中,在 if, while 或 foreach 等语句块中也可以使用。比如:
[code=perl]
#!/usr/bin/perl

$seq = 100;
print "$seq \n";
print "-------------\n";
foreach (1..10) {
        my($seq) = $_ * $_;
        print "$seq \n";
}

print "-------------\n";
print "$seq \n";[/mw_shl_code]
运行输出:
./my2.pl
100
-------------
1
4
9
16
25
36
49
64
81
100
-------------
100

需要注意的是,在 my 不使用括号时,它只用来声明单个词法变量。如:
my $friend, $good;              #这里没有声明 $good 这个变量
my($friend, $good);            #这里两个变量都声明了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 23:50 , Processed in 0.078588 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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