Perl 语言环境能够解释在 Net.Data 宏的一个 FUNCTION 块中指定的在线 Perl 脚本, 或者它能处理存储在服务器上单独文件中的外部 Perl 脚本。
验证 Net.Data 初始化文件中有以下配置语句,并且是在一行上:
ENVIRONMENT (DTW_PERL) DTWPERL ( OUT RETURN_CODE )
参见环境配置语句,以进一步了解 Net.Data 初始化文件和语言环境 ENVIRONMENT 语句。
日文用户: | 日文 SJIS 字符集的某些字符可能会被 Perl 错误地解释成控制字符。 有一个名为 jperl 的开放源代码程序包可解决此问题。下载并安装该程序包, 然后在 Perl 脚本的标题中包括语句use I18N::Japanese.pm。 |
对外部 Perl 脚本的调用在 FUNCTION 块中是由一个 EXEC 语句来标识的:
%EXEC{ perl_script_name [optional parameters] %}必需: 请确保 Perl 脚本名称 perl_script_name 列在 Net.Data 初始化文件中为 EXEC_PATH 配置变量 指定的路径中。
%FUNCTION(DTW_PERL) perl1() { %EXEC{MyPerl.pl %} %}
有两种方式将信息传递到 Perl (DTW_PERL) 语言环境调用的程序,直接和间接。
%DEFINE INPARM1 = "SWITCH1" %FUNCTION(DTW_PERL) sys1() { %EXEC{ MyPerl.pl $(INPARM1) "literal string" %} %}
Net.Data 变量 INPARM1 被引用并被传递到 Perl 脚本。参数传递到 Perl 脚本的方式与从命令行 调用 Perl 脚本时参数传递到 Perl 脚本的方式相同。 使用这种方式传递给 Perl 脚本的参数被认为是输入类型参数(传递给 Perl 脚本的参数可以由 Perl 脚本 使用和处理,但对参数的更改并反映给 Net.Data)。
使用以下一种方法在调用 Perl 脚本时直接传递参数:
name="value"
对于复合数据项,可以用一个新行字符 或空字符分开每个项。
如果一个变量名称与输出参数的名称相同且使用上述语法, 则新的值将替换当前值。 如果变量名不对应于输出参数,Net.Data 将把它忽略。
以下示例显示了 Net.Data 如何从一个宏传递变量。
%FUNCTION(DTW_PERL) today() RETURNS(result) { $date = `date`; chop $date; open(DTW, "> $ENV{DTWPIPE}") || die "Could not open: $!"; print DTW "result = \"$date\"\n"; %} %HTML(INPUT) { @today() %}
如果 Perl 脚本位于一个名为 today.pl 的外部文件中,那么这个函数可以按下一个 示例来编写:
%FUNCTION(DTW_PERL) today() RETURNS(result) { %EXEC { today.pl %} %}
可以 Net.Data 表格传递给由 Perl 语言环境调用的 Perl 脚本。Perl 脚本 根据 Net.Data 宏表格参数的 Net.Data 名称来访问它们的值。列标题和字段值都包含在用表格名和 列号标识的变量中。例如,在表格 myTable 中,列标题是 myTable_N_j, 字段值是 myTable_V_i_j,其中 i 是行号, j 是列号。表格的行数与列数是 myTable_ROWS 和 myTable_COLS。
REPORT 和 MESSAGE 块在所有 FUNCTION 部分都是允许的。 它们由 Net.Data 来处理,而不是由 语言环境来处理。当然,Perl 脚本可以将文本写至标准输出流,作为 Web 页面的一部分。
以下示例显示了 Net.Data 如何通过执行外部的 Perl 脚本来生成一个表格:
%define { c = %TABLE(20) rows = "5" columns = "5" %} %function(DTW_PERL) genTable(in rows, in columns, out table) { %exec{ perl.pl %} %message{ default: "genTable: Unexpected Error" %} %} %HTML(REPORT){ @genTable(rows, columns, c) return code is $(RETURN_CODE) %} The Perl script (perl.pl): open(D2W,"> $ENV{DTWPIPE}"); print "genTable begins ... "; $r = $ENV{ROWS}; $c = $ENV{COLUMNS}; print D2W "table_ROWS=\"$r\" "; print D2W "table_COLS=\"$c\" "; print "rows: $r "; print "columns: $c"; for ($j=1; $j<=$c; $j++) { print D2W "table_N_$j=\"COL$j\" "; } for ($i=1; $i<=$r; $i++) { for ($j=1; $j<=$c; $j++) { print D2W "table_V_$i","_","$j=\"" $i $j "\" "; } } close(D2W);
结果:genTable 生成:
rows: 5 columns: 5 COL1 | COL2 | COL3 | COL4 | COL5 | -------------------------------------------------- [ 1 1 ] | [ 1 2 ] | [ 1 3 ] | [ 1 4 ] | [ 1 5 ] | -------------------------------------------------- [ 2 1 ] | [ 2 2 ] | [ 2 3 ] | [ 2 4 ] | [ 2 5 ] | -------------------------------------------------- [ 3 1 ] | [ 3 2 ] | [ 3 3 ] | [ 3 4 ] | [ 3 5 ] | -------------------------------------------------- [ 4 1 ] | [ 4 2 ] | [ 4 3 ] | [ 4 4 ] | [ 4 5 ] | -------------------------------------------------- [ 5 1 ] | [ 5 2 ] | [ 5 3 ] | [ 5 4 ] | [ 5 5 ] | -------------------------------------------------- return code is 0