1

我看过这篇SO 帖子,并看到了关于

my @array = ('a', 'b', 'c');
my  $variable  = @array;           #  3   size of @array
my ($variable) = @array;           # 'a'  $array[0]

@array分配to的第一个元素my ($variable)

我对我继承的以下代码有点困惑。具体来说,是

my ($ptBatchRec);

被声明为指针?

如果我去掉括号会发生什么?

my $DBHandle = shift;                   # The ICS database handle
my $ptBatchStruct = shift;              # -> batch structure (hash)
my ($FiscalYear, $AccountType, $BatchType, $PaymentType, %Args) = @_;

my $DBIsLocked = 0;                     # Database is locked flag
my ($ptBatchRec);                       # -> batch record
.
.
.
    $ptBatchRec = $DBHandle->selectrow_hashref(
        "select * from batch " .
            "where yr matches ".$DBHandle->quote($FiscalYear)." " .
                "and entry_date = " .
                    $DBHandle->quote($ptBatchStruct->{"entry_date"})." " .
                "and acct_type = ".$DBHandle->quote($AccountType)." " .
                "and batch_type = ".$DBHandle->quote($BatchType)." " .
                "and pymt_code = ".$DBHandle->quote($PaymentType)." " .
            "order by batch_num desc");
4

2 回答 2

5

它没有被特别声明为任何东西(它是一个标量,来自$,并且它没有被初始化,所以它会开始持有undef)。

然后它被分配的结果selectrow_hashref,你可以从名称中看出,将返回一个哈希引用(至少如果它成功;它可能undef失败)。引用有点像指针,但在 perl 中没有“指针”。perlrefperlreftut是很好的资源。

特别是,使用括号不会更改声明。

于 2013-06-27T17:30:13.540 回答
3
  1. Perl 没有指针。它们被称为引用(但与指针减去指针算术完全一样)。

  2. 括号没有特殊的语法。在这里,他们只是为分配的 RHS 提供列表上下文。IE

    my ($x, $y) = @array;
    

    是相同的

    (my $x, my $y) = ($array[0], $array[1]);
    

    是相同的

    my $x = $array[0]; my $y = $array[1];
    

    因此,LHS 上一个元素的特殊情况my ($x) = @array

    my $x = $array[0];
    

    如果括号用于my,但没有赋值,那么这只对声明多个变量有用,因此my ($foo);my $foo;完全等价。

  3. 目的$DBHandle->selectrow_hashref是返回对哈希的引用。当它被分配给$ptBatchRec变量时,是的,该变量将保存一个引用。

    但是该变量可以保存任何类型的标量,其中哈希引用只是一种类型。

于 2013-06-27T17:37:04.740 回答