0

私の基本的な質問はこれです。DbIoFuncパッケージのルーチンにパラメータを渡さない場合、OpenIcsDB()なぜパッケージ名が含まれているの@_ですか?

次の関数にパラメーターを渡さない場合は @_ が null になると予想していますが、代わりにパラメーターにパッケージ名が含まれています。クラス->::構文で呼び出してみましたが、違いはありません。

次以外のパラメーターが渡されていないかどうかを判断するには、何をテストすればよいですか?

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

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

私は2つのことを疑問に思っています。なぜパッケージ名はの一部で@_あり、パッケージ名を取り除くための最良の方法は何ですか?

呼び出しは次のとおりです。

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

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

おそらく、関数を として呼び出したいと思うでしょうDbIoFunc::OpenIcsDb()。アロー演算子を使用すると、いくつかのオブジェクト処理が行われます。

于 2013-07-03T19:30:51.480 に答える
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 に答える