标签 函数调用 下的文章

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;