如何在perl中返回正确的对象属性?

CDa*_*aly 3 perl hash object

我有一个我创建的包,用于返回对象的指定属性(缩短的代码)

package vendor_info;

my $vars;
sub new{
    my $class = shift;
    $vars = {
        _servers => shift,
        _locations => shift,
        _favorite => shift,
        _default_selection => shift,
        _database => shift,
        _DB => shift};

    bless $vars, $class;
    return $vars;
}
sub get_locations{
    return $vars->{_locations};
}

sub get_database{
    return $vars->{_database};
}
sub get_DB{
    return $vars->{_DB};
}
Run Code Online (Sandbox Code Playgroud)

我的perl文件接收从终端解析的输入,但在这种情况下,变量$ vendor被硬编码用于测试.我有一个散列中的对象列表,我想根据对象返回正确的属性.一些变量已使用占位符删除.

$vendor = "atrena";

my %vendor_hash = (
    "atrena" => new vendor_info("Variable_server","Variable_location","Advanced_CDC|CDC dftso|DFT|gui|GUI|adv_checker|Lint|spl-view-only|view-only-GUI","adv_checker","database","DB"),

    "ansys" => new vendor_info("Variable","Location","agppi|agppi|ane3fl|ane3fl|ansys|ansys|ensemble_gui|ensemble_gui|hfss_desktop|hfss_desktop|hfss_gui|hfss_gui|hfss_solve|hfss_solve|hfsshpc_pack|hfsshpc_pack|optimetrics|optimetrics|q3d_desktop|q3d_desktop|rdacis|rdacis|struct|struct","ane3fl","database", "db"),

    "coventor" => new vendor_info("var","location","COV_ZsplatViewer|Viewer|COV_VoxelModeler|Voxel-Modeler|MEMSp_Import_Package|Import-Package|MEMSp_Innovator_Plugin|Innovator-Plugin|MEMSp_MATLAB_Simulation|MATLAB-Simulation|MEMSp_Platform|Platform|MTI_AutoBuilder|Auto-Builder|MTI_Catapult|Catapult|MTI_CoventorWare|Coventor-Ware|MTI_Memcap|Memcap|MTI_PreProcessor|PreProcessor","database","db","db")   

);

$vendor_object = $vendor_hash{$vendor};

print Dumper( $vendor_object);

$foodb = $vendor_object -> get_database();
Run Code Online (Sandbox Code Playgroud)

转储器正在打印正确的信息,但是,当我调用get_database()时,被调用的数据库始终是列表中最后一个对象的属性,在本例中是coventor.对于任何子例程的吸气剂都可以这样说.

如何为正确的对象调用正确的属性?

Dav*_*oss 7

你有$vars一个词法变量,它的范围是包含你的包的文件.因此,此变量只有一个实例,它将始终包含已设置的最后一个对象的数据.

我不确定你在哪里采用这种方法,但这并不是Perl对象的工作方式.$vars应该限定为只存在于构造函数中,并且访问者应该使用传递给它们的对象作为它们的第一个参数(传统上称为$self).

# Only pragmas should start with lower-case letters
package VendorInfo;

sub new{
    my $class = shift;
    my $vars = {
        _servers => shift,
        _locations => shift,
        _favorite => shift,
        _default_selection => shift,
        _database => shift,
        _DB => shift
    };

    return bless $vars, $class;
}

# Just one example accessor...
sub get_database{
    my $self = shift;
    return $self->{_database};
}
Run Code Online (Sandbox Code Playgroud)

还有一点,请使用Class->new()代替new Class您在代码中使用的可能有问题的语法.