我有一个我创建的包,用于返回对象的指定属性(缩短的代码)
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.对于任何子例程的吸气剂都可以这样说.
如何为正确的对象调用正确的属性?
你有$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您在代码中使用的可能有问题的语法.