0

我的基本问题是这个。如果我没有将参数传递给我的包 -DbIoFunc的例程OpenIcsDB(),为什么 pacakge 名称在@_

当我没有将参数传递给以下函数时,我期望 @_ 为空,但参数包含包名称。我试过用类->::语法调用,没有区别。

我应该测试什么来确定除了以下参数之外是否没有传递任何参数?

my ($Temp, $DBPathLocal) = @_; 

if(!defined $DBPathLocal)
{
    $DBPathLocal = DBDEV;
}

我想知道两件事。为什么包名是其中的一部分,@_并且是我所做的最好的方法来摆脱包名?

这是电话:

my ($DBHand);
$DBHand = DbIoFunc->OpenIcsDb();

这是功能:

sub OpenIcsDb
#
# DB Path Constant DBPROD or DBDEV.
#
{
    # Path passed in, either DBPROD or DBDEV
    my ($DBPathLocal); 

    my ($DBSuffix);
    my ($DBHand);      # ICS database handle

    $DBPathLocal = shift;

    #
    # Make sure the database path exists.
    #

    if (length($DBPathLocal) <= 0)
    {
        if (!$Debugging)
        {
            $DBPathLocal= DBPROD;
        }
        else
        {
            $DBPathLocal = DBDEV;
        }
    }
    else
    {
        $DBPathLocal = DBDEV;
    }

    my $DBSuffix = DBSUFFIX;

    $! = 2;
    die("Can't find database directory ".$DBPathLocal.".".$DBSuffix)
    unless ((-e $DBPathLocal.".".$DBSuffix) && (-d $DBPathLocal.".".$DBSuffix));
    #
    # See if we can connect to the ICS database.  We can't proceed without it.
    #
    $DBHand = DBI->connect("dbi:Informix:".$DBPathLocal, "", "")
        or die("Can't connect to the ICS database ".$DBPathLocal);

    return $DBHand;
}
4

3 回答 3

1

您可能希望将该函数称为DbIoFunc::OpenIcsDb(). 使用箭头运算符可以做一些对象的事情。

于 2013-07-03T19:30:51.480 回答
1

我试过用 class -> 和 :: 语法调用,没有区别。

它们是有区别的。如果您使用::并且不传递任何其他参数,@_ 则将为空。您可以通过在函数顶部插入以下代码来确认这一事实:

print '@_ contains ' . scalar(@_) . " elements\n";

你真正的问题可能在这里:

$DBPathLocal = shift;
if (length($DBPathLocal) <= 0)

如果@_为空,$DBPathLocal则为undef。而且length(undef)总是undef。而且undef <= 0永远是真的

专家提示:

use warnings;
use strict;
于 2013-07-03T21:44:21.253 回答
1

要进行 OOP,Perl 必须知道包名或对象的引用才能工作。如果使用::call 方法,则可以避免这种情况。

package Foo;

sub bar {
  print "@_\n";
}

package main;

Foo->bar();
Foo::bar();
bar Foo();

请注意,调用Foo::bar();不会打印包名称。

于 2013-07-04T12:57:10.953 回答