标签 函数调用 下的文章

Perl的模块、包和跨文件的函数调用


Perl 子程序(函数)

Perl 子程序可以出现在程序的任何地方,语法格式如下:

sub subroutine{
   statements;
}

调用子程序语法格式

subroutine( 参数列表 );

在 Perl 5.0 以下版本调用子程序方法如下

&subroutine( 参数列表 );
向子程序传递参数

Perl 子程序可以和其他编程一样接受多个参数,子程序参数使用特殊数组 @_ 标明。

因此子程序第一个参数为 $_[0], 第二个参数为 $_[1], 以此类推。

不论参数是标量型还是数组型的,用户把参数传给子程序时,perl默认按引用的方式调用它们。

子程序返回值

子程序可以向其他编程语言一样使用 return 语句来返回函数值。

如果没有使用 return 语句,则子程序的最后一行语句将作为返回值。

#!/usr/bin/perl

# 方法定义
sub add_a_b{
   # 不使用 return
   $_[0]+$_[1];  

   # 使用 return
   # return $_[0]+$_[1];  
}
print add_a_b(1, 2)
Perl 包和模块

Perl 中每个包有一个单独的符号表,定义语法为:

package mypack;

例子程序:

文件名为db_operate.pm的库perl文件

#!/usr/bin/perl -w

use strict;
use DBI;

package sql;
sub execute {
        my $host = "localhost";
        my $driver = "Pg";
        my $database = "library";
        my $user = "admin";
        my $passwd = "157359";

        my $stmt = $_[0];
        my $dsn = "DBI:$driver:dbname=$database;host=127.0.0.1;port=5432";;
        my $dbh = DBI->connect($dsn,$user,$passwd) or die $DBI::errstr;
        my $sth = $dbh->prepare($stmt);
        $sth->execute();

        my @array;
        while ( my @row = $sth->fetchrow_array() ) {
                push(@array,[@row]);
        }

        return @array;

        $sth->finish();
        $dbh->disconnect;

}
1;              #不添加执行db_test.cgi时会出现错误db_operate.pm did not return a true value at db_test.cgi line 7.
                #                              BEGIN failed--compilation aborted at db_test.cgi line 7.

文件名为db_test.cgi文件去调用模块文件db_operate.pm中的包sql里的execute函数,传入参数为$sql,传出参数为@array:

#!/usr/bin/perl -w

use strict;
use JSON;
use CGI;
use Encode;
use db_operate;   #调用模块文件db_operate.pm,还可用require函数调用文件,但是其调用方式为require db_operate.om;

my $sql = "select * from lib_user";
my @array = sql::execute($sql);        #调用sql包中的execute函数,其参数为$sql
my $json = decode_utf8(encode_json \@array);
my $q = new CGI;
print $q->header(-charset=>'utf-8',-type=>'application/json');
print $json;