代码:
#!/usr/bin/perl
use strict;
use warnings;
use lib '/home/user/perl/lib/';
use SQLConnect;
my $db_something = SQLConnect->newConn({dns => "SOMETHING"});
my $sql_data = $db_something->select_fetchallArray();
for my $row ( @{$sql_data} ) {
print ",";
for my $column (@{$row}) {
print $column . ",";
}
print "\n";SQLConnect.pm (个人)
sub newConn {
my ($class, $args) = @_;
my $self = bless {
dns => $args,
user => myINIconfig::ini_dbUser($args->{dns}),
password => myINIconfig::ini_dbPass($args->{dns}),
}, $class;
}这是使用调度表返回变量的适当方式吗?我试图返回的变量位于我的iniConfig包中,它包含一个方法来解析用户名和密码到我们的odbc.ini数据库的用户名和密码的odbc.ini文件。我收到以下错误:
不能使用字符串(“某事”)作为散列引用,而使用“严格引用”。
sub ini_dbUser {
my $self = shift;
my $dbh = ( $self->{dns} );
open( INI, "$path$ini" ) || die "Can't open $ini: $!\n";
while (<INI>) {
chomp;
next if /^\s*#/; # ignore comments
next if /^\s*;/; # ignore ;
if ( /^\s*[\s*(.+?)\s*]\s*$/ ) { }
if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
if ( ( $database eq $dbh ) && ( $keyword eq "username" ) ) {
$user = $value;
print "$user\n";
}
}
}
close(INI);
return ($user);
}发布于 2016-09-02 16:00:51
您对哈希索引的级别感到困惑
首先,构造函数newConn将被传递给哈希{dns => "SOMETHING"}的$args值的引用,然后在元素dns => $args中创建对象时直接使用该引用。这意味着您将其设置为dns => {dns => "SOMETHING"},这看起来不太好
然后在调用dns时提取$args的myINIconfig::ini_dbUser($args->{dns})元素的值,因此调用myINIconfig::ini_dbUser("SOMETHING")。但是ini_dbUser首先将该参数复制到$self,然后尝试将其用作my $dbh = ( $self->{dns} )中的哈希引用。因此,您的错误消息Can't use string ("SOMETHING") as a HASH ref
我不知道什么是正确的,但是将调用更改为myINIconfig::ini_dbUser($args)至少会让它正常工作
$self的使用意味着ini_dbUser是一种面向对象的方法,但您将其称为一个简单的函数。也许这就是问题所在吗?
发布于 2016-09-02 15:58:00
ini_dbUser希望传递$args (带有dns键的哈希key),而不是$args->{dns}。
这看起来也不对:
my $self = bless {
dns => $args,这就是设置{ 'dns' => { 'dns' => 'SOMETHING' }, ...
https://stackoverflow.com/questions/39295806
复制相似问题