在perl上写下未经处理的引用

时间:2014-03-18 08:25:04

标签: perl ubuntu gentoo

为什么我收到错误说"无法调用方法'写'在/usr/..."上的未经证实的参考文献; 当我在我的ubuntu上运行时,没有任何错误,但是当我在我的gentoo上运行此代码时。弹出此错误。我认为操作系统不是问题所在。但它是什么?

这是我的代码:

#!/usr/bin/perl
#index.cgi

require 'foobar-lib.pl';


ui_print_header(undef, $module_info{'desc'}, "", undef, 1, 1);


ui_print_footer("/", $text{'index'});

use CGI;
use Config::Tiny;
use Data::Dumper;
use CGI::Carp qw(fatalsToBrowser);

#location/directory of configuration file
my $file = "/home/admin_config.conf";
my $Config = Config::Tiny->read($file);

#reads the section, key and the value of the configuration file.
my $status_in_file = $Config->{"offline_online_status"}->{"offline_online_status.offline_online_state"};

print "Content-type:text/html\n\n";

print qq~<html>
<link rel="stylesheet" type="text/css" href="style4.css">
<body>

<div id="content">
<div id="bar">
<span><p>Controller Settings</p></span>
</div>

<div id="tab-container">
<ul> 
<li><span><a href="index.cgi">Offline / Online State</a></span></li>
</ul>

</div>

<div id="main-container">

<table border="0" width="100%" height="80%">
<tr>
<td align="left" width="20%">
<div id="title"><span>Offline/Online Status :</span></div>
</td>
<td width="25%">
<table border="0" style=\"text-align:right;font-family:Arial, Helvetica, sans-serif;\" cellpadding="5">
<tr>
<td width="30%"><div id="data">Offline Online State:</div></td>
</tr>
<tr>
<td width="30%"><div id="data">Data Mode:</div></td>
</tr>
</table>
</td>
<td align="left" width="20%">
<table border="1" style=\"text-align:center;font-family:Arial, Helvetica, sans-serif;\" cellpadding="5">
<tr>
<td width="20%"><div id="data">$status_in_file</div></td>
</tr>
</table>
</td>
<td width="50%"></td>
</tr>
<tr>
<td colspan="4">
<div id="description"><p><b>Description :</b></p>
<p>This <i>indication</i> is sent ..</p>
</div>
</td>
</tr>
</table>


</div>
</div>


</body>
</html>

~;

有人可以帮帮我吗? 这是我的foobar-lib.pl

=head1 foobar-lib.pl
foreign_require("foobar", "foobar-lib.pl");
@sites = foobar::list_foobar_websites()
=cut
BEGIN { push(@INC, ".."); };
use WebminCore;
init_config();
=head2 get_foobar_config()
=cut
sub get_foobar_config
{
my $lref = &read_file_lines($config{'foobar_conf'});
my @rv;
my $lnum = 0;
foreach my $line (@$lref) {
my ($n, $v) = split(/\s+/, $line, 2);
if ($n) {
push(@rv, { 'name' => $n, 'value' => $v, 'line' => $lnum });
}
$lnum++;
}
return @rv;
} 

我也不太了解这个foobar-lib.pl。也许这可能导致我的问题,当我运行代码时?

2 个答案:

答案 0 :(得分:1)

您所显示的代码并不会尝试在任何内容上调用名为write的方法,更不用说在未完成的引用上了。所以我假设方法调用发生在你没有显示的一些代码中。也许在foobar-lib.pl?

因为我看不到导致错误的代码,所以我只能根据调用该方法的线索write来冒险猜测。

在Perl中,对于文件句柄是否归类为“对象”(因此可以使用调用它们的方法)或者未经编辑的引用(因此不能),它有点模棱两可。 Perl 5.12中的情况发生了变化,Perl 5.14再次发生了变化。因此,如果您在每台计算机上安装了不同版本的Perl,那么在尝试执行此操作时您可能会发现不同的行为:

$fh->write($data, $length)

Perl 5.14+行为可能就是您想要的(因为它是最棒的),幸运的是,您可以通过预加载几个模块在早期版本的Perl上实现相同的行为。将以下两行添加到脚本的顶部:

use IO::Handle ();
use IO::File ();

问题解决了......也许???

答案 1 :(得分:0)

可能是因为模块安装在不同服务器上的不同位置。请在服务器上执行perl -V,并且检查模块位于相同的位置。

还要检查传递给该方法的内容。 还要检查权限,您的程序是否具有写访问权限?