如何对子程序使用“绑定”?

时间:2010-12-22 01:00:10

标签: perl

我的脚本似乎有一个小问题,我需要调用“绑定”脚本中较早的子例程,以便我可以访问与哈希绑定的对象相关的函数至。问题是,当我去运行脚本时,它返回错误“无法调用方法”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

2 个答案:

答案 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指出哪个是第二个问题的缺失引用。修正如上。