Perl初级教程 - 第四天


 

 

 

 

第三页:子过程

和很多语言一样,Perl允许用户定义自己的函数,称为子过程(subroutine)。它们可以放在程序的任何地方,但是最好把它们全放在程序的顶部或尾部。

子过程的形式如下:

sub mysubroutine
{
	print "Not a very interesting routine\n";
	print "This does the same thing every time\n";
}

可以给子过程传递任何数量的参数。下面的语句都可以调用这个子过程。注意子过程在调用时在名称前使用一个&字符:

&mysubroutine;		# Call the subroutine
&mysubroutine($_);	# Call it with a parameter
&mysubroutine(1+2, $_);	# Call it with two parameters

参数

在上面的例子中参数被接受但是被忽略。当子过程被调用时,任何参数都被传递到特殊表数组变量@_中,这个变量与$_没有任何关系。下面的子过程只是打印它被调用的参数的列表。后面是一些调用它的例子。

sub printargs
{
	print "@_\n";
}

&printargs("perly", "king");	# Example prints "perly king"
&printargs("frog", "and", "toad"); # Prints "frog and toad"

和任何其它列表数组一样,@_中的单个元素可以通过方括号访问:

sub printfirsttwo
{
	print "Your first argument was $_[0]\n";
	print "and $_[1] was your second\n";
}

要注意的是标量$_[0]和$_[1]等与标量$_没有任何关系。

返回值

子过程的结果总是最后被赋值。下面的子过程返回其两个输入参数中较大的,然后是一个调用这个子过程的例子。

sub maximum
{
	if ($_[0] > $_[1])
	{
		$_[0];
	}
	else
	{
		$_[1];
	}
}

$biggest = &maximum(37, 24);	# Now $biggest is 37

上面的&printfirsttwo子过程也返回一个值,这时是1。这是因为这个子过程所做的最后一件事是print语句,打印成功的结果总是1。

局部变量

@_变量对当前子过程是局部的,当然$_[0]、$_[1]、$_[2]等也是这样。其它变量也可以被设置为局部的,这在我们开始改变输入参数时是有用的。下面的子过程判断一个字符串是否在另一个中,不包括空格。然后是一个引用它的例子。

sub inside
{
	local($a, $b);			# Make local variables
	($a, $b) = ($_[0], $_[1]);	# Assign values
	$a =~ s/ //g;			# Strip spaces from
	$b =~ s/ //g;			#   local variables
	($a =~ /$b/ || $b =~ /$a/);	# Is $b inside $a
					#   or $a inside $b?
}

&inside("lemon", "dole money");		# true

实际上,可以简化为

local($a, $b) = ($_[0], $_[1]);

Perl初级教程
第一页 Split
第二页 关联数组
第三页 子过程

[第1天][第2天][第3天][第4天]

 



本文根据 网猴 相关文章改编,版权归原作者所有。