get_billable_pages
在追寻错误时,我遇到了以下Perl子例程。它需要12个参数。
sub get_billable_pages {
my ($dbc,
$bill_pages, $page_count, $cover_page_count,
$domain_det_page, $bill_cover_page, $virtual_page_billing,
$job, $bsj, $xqn,
$direction, $attempt,
) = @_;
my $billable_pages = 0;
if ($virtual_page_billing) {
my @row;
### Below is testing on the existence of the 11th and 12th parameters ###
if ( length($direction) && length($attempt) ) {
$dbc->xdb_execute("
SELECT convert(int, value)
FROM job_attribute_detail_atmp_tbl
WHERE job = $job
AND billing_sub_job = $bsj
AND xqn = $xqn
AND direction = '$direction'
AND attempt = $attempt
AND attribute = 1
");
}
else {
$dbc->xdb_execute("
SELECT convert(int, value)
FROM job_attribute_detail_tbl
WHERE job = $job
AND billing_sub_job = $bsj
AND xqn = $xqn
AND attribute = 1
");
}
$cnt = 0;
...;
但是有时仅用10个参数调用
$tmp_det = get_billable_pages(
$dbc2,
$row[6], $row[8], $row[7],
$domain_det_page, $bill_cover_page, $virtual_page_billing,
$job1, $bsj1, $row[3],
);
该函数检查第11个和第12个参数。
仅将10个参数传递给函数时,第11和12个参数是什么?
因为第11和第12个参数最终都是随机值,所以仅用10个参数调用该函数是否是一个错误?
我认为这可能是错误的来源,因为当程序失败时,第12个参数的值很时髦。
我没有看到仅包含10个参数的函数的另一个定义。
这些值将从参数数组中复制@_
到标量变量列表中。
如果数组比列表短,那么多余的变量将设置为undef
。如果数组比列表长,则忽略多余的数组元素。
请注意,原始数组@_
未被分配修改。不会创建或丢失任何值,因此它仍然是调用子例程时传递的实际参数的确定来源。
ikegami建议我提供一些Perl代码,以演示将数组分配给标量列表。这是Perl代码,主要基于他的编辑
use strict;
use warnings;
use Data::Dumper;
my $x = 44; # Make sure that we
my $y = 55; # know if they change
my @params = (8); # Make a dummy parameter array with only one value
($x, $y) = @params; # Copy as if this is were a subroutine
print Dumper $x, $y; # Let's see our parameters
print Dumper \@params; # And how the parameter array looks
输出
$VAR1 = 8;
$VAR2 = undef;
$VAR1 = [ 8 ];
因此, $x
和$y
都被修改,但是如果数组中的值不足,undef
则使用。好像源数组使用undef
元素无限扩展。
现在让我们看一下Perl代码的逻辑。出于条件测试的目的,undef
评估结果为假,但是您length
像这样应用运算符
if ( length($direction) && length($attempt) ) { ... }
如果您已use warnings
按需安装,Perl通常会Use of uninitialized value
发出警告。但是length
不寻常的是,如果您要求一个undef
值的长度(并且您正在运行的是Perl 5的12版或更高版本),它只会返回undef
而不是警告您。
关于“我没有看到仅包含10个参数的函数的另一种定义”,Perl没有像C ++和Java这样的函数模板-子例程中的代码可以查看传递的内容并相应地表现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句