gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:45:52 24 4
gpt4 key购买 nike

我在追逐错误时遇到了以下 Perl 子例程 get_billable_pages。它需要 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 ];

所以 both $x$y 都被修改了,但是如果数组中的值不足,那么 undef 被改用。就好像源数组被 undef 元素无限扩展了。

现在让我们看看 Perl 代码的逻辑。 undef 出于条件测试的目的评估为 false,但您应用了 length像这样的运算符

if ( length($direction) && length($attempt) ) { ... }

如果您按照应有的方式设置了使用警告,Perl 通常会产生一个Use of uninitialized value 警告。然而 length 的不寻常之处在于,如果您询问 undef 值的长度(并且您正在运行 Perl 5 版本 12 或更高版本),它只会返回 undef 而不是警告你。

关于 “我没有看到只接受 10 个参数的函数的另一个定义”,Perl 没有像 C++ 和 Java 那样的函数模板——这取决于子例程中的代码查看传递的内容并据此采取行动。

关于perl - Perl 子例程从哪里获取实际参数中缺少的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com