Perl子例程从哪里获取实际参数中缺少的值?

用户名

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获取Perl子例程的参数内容

来自分类Dev

Perl子例程中的本地$ _

来自分类Dev

PERL中的子例程原型

来自分类Dev

Perl子例程中的本地$ _

来自分类Dev

Perl子例程引用无法获取值

来自分类Dev

Perl子例程返回意外值

来自分类Dev

Perl子例程未返回任何值

来自分类Dev

Perl子例程未返回任何值

来自分类Dev

检查Perl中是否存在子例程

来自分类Dev

perl中的子例程以执行#ARGV条目

来自分类Dev

不能在perl中定义其值不能在子例程中更改的变量?

来自分类Dev

VBA在OnAction中包含子例程的参数

来自分类Dev

参数传递给Perl子例程的顺序重要吗?

来自分类Dev

将大量参数传递给Perl子例程还是?

来自分类Dev

Perl:修改作为参数传递给子例程的变量

来自分类Dev

正确检测Perl子例程参数是否为数组

来自分类Dev

参数传递给Perl子例程的顺序重要吗?

来自分类Dev

将参数传递给Perl类子例程

来自分类Dev

perl将内部数组作为子例程的参数发送

来自分类Dev

获取子例程中数组内容的哈希

来自分类Dev

锁定Perl子例程

来自分类Dev

如何获取带有子例程的开始和结束行号的perl子例程列表?

来自分类Dev

在fortran的子例程中更新数组的值

来自分类Dev

从“按原样”存储perl子例程的返回值

来自分类Dev

Excel VBA模块子例程未通过参数获取

来自分类Dev

如何为可选子例程参数指定默认值?

来自分类Dev

Perl子例程中的变量不会释放内存

来自分类Dev

如何在Perl中创建动态子例程名称

来自分类Dev

Perl脚本中的奇数子例程编译错误