我的脚本似乎有一个小问题,我需要调用“绑定”脚本中较早的子例程,以便我可以访问与哈希绑定的对象相关的函数至。问题是,当我去运行脚本时,它返回错误“无法调用方法”SetWriteMode“在cbc_encrypt_test.pl第30行的未完成引用上。”起初我不知道它在说什么,我认为问题是由于我使用引用指向子程序,该子程序首先返回哈希引用。因为到目前为止我理解“config_file = \%cfg”在这种情况下。在看了关于perlref的perldoc后,我仍然迷失了。我很好地阅读了该文档,并没有看到以我需要的方式引用子程序的任何内容。
到目前为止整个脚本。
#!/usr/bin/perl
use strict;
use warnings;
use Term::ANSIColor;
use Config::IniFiles;
use Crypt::CBC;
start_script();
sub start_script {
system ("clear");
encrypt_password();
} # end start_script
sub config_file {
my $cfg_file = 'settings.ini';
my %cfg;
tie %cfg, 'Config::IniFiles', ( -file => "$cfg_file" );
return \%cfg;
} # end config_file
sub encrypt_password {
my $password = config_file()->{ESX}{password};
my $cipher = Crypt::CBC->new( -key => 'EF1FAD9B87F8365B242669E624FEB36CDBCCFEE0096CC45DDDCF6F5995E83F61',
-cipher => 'Rijndael'
);
my $encrypted_password = $cipher->encrypt_hex("$password");
chomp $encrypted_password;
config_file()->{ESX}{password} = $encrypted_password;
tied config_file()->SetWriteMode(0666);
tied config_file()->RewriteConfig();
return $encrypted_password;
} # end encrypt_password
答案 0 :(得分:4)
绑定。如果你有这样一个变量的引用,你可以这样做:
tied( %{ config_file() } )
但是在你的代码中,每次调用config_file都会创建一个新的绑定哈希,而你在前一个哈希的绑定对象上调用的方法也没有用,所以你需要确保config_file()只是调用一次(或让它在内部记忆其结果)。
答案 1 :(得分:2)
看起来像是一个优先问题。通过B::Deparse
运行构造显示了问题:
$ perl -MO=Deparse,-p -e 'tied config_file()->method()'
tied(config_file()->method);
-e syntax OK
所以Perl首先尝试在config_file()
返回的引用上调用该方法,并且失败,因为该引用不是一个受祝福的对象(如tied
将返回)。
而是尝试:
tied(%{config_file()})->SetWriteMode(0666);
tied(%{config_file()})->RewriteConfig();
或更好:
my $cfg = tied %{config_file()};
$cfg->SetWriteMode(0666);
$cfg->RewriteConfig();
或
for (tied %{config_file()}) {
$_->SetWriteMode(0666);
$_->RewriteConfig();
}
此外,根据Config::IniFiles
的编写方式,您可能遇到问题,每次调用config_file()
都会返回一个新对象,因此您调用的聚合调用不会相互适用。您应该按my answer to your previous question。
编辑:我没有发现ysth指出哪个是第二个问题的缺失引用。修正如上。