求perl高手帮忙看一下怎么避免下面的错误

nanhaiyiou 2014-11-11 04:41:13
源代码如下:
	open( FILEHANDLE, $my_conffile ) or die "$0: $my_conffile: $!\n";
flock( FILEHANDLE, 1 );
seek( FILEHANDLE, 0, 0 );
while( <FILEHANDLE> ){
$my_confcode .= $_;
}
$my_returnconf = eval( $my_confcode );
if( $@ ){
$@ =~ s/\s+$//s;
die "$0: $@\n";
};
return $my_returnconf


$my_conffile 文件的内容:
print "hello,word!\n";


执行后,返回值为:1

错误信息为:
Can't use string ("1") as a HASH ref while "strict refs" in use xxxxxxx.pl line: 776

请求高手帮忙,怎么才能使eval的返回值不是1,或者帮忙解释一下问题所在。什么样的文件才能使返回值为0
...全文
179 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-11-14
  • 打赏
  • 举报
回复
引用 5 楼 nanhaiyiou 的回复:
我也不知道$CONFFILE的内容是什么?
那你就敢读进来eval! 之所以需要知道$CONFFILE的内容,是因为要怎样处理它取决于它的内容。例如:

$a = eval("1+2"); # eval返回一个值,你可以用来赋值、打印或运算。但如果你不用它,
                           # 它也就没有了,即eval不会主动改变当前环境。
eval("$b = 1");  # eval会建立一个变量$b,改变了当前环境,后面你可以使用$b
print($b);
另外,因为外面文件的内容是你没法控制的,所以盲目eval也是很危险的。
fibbery 2014-11-14
  • 打赏
  • 举报
回复
perl在执行的时候,最后一行语句执行的结果就是所有代码执行的解决. 比如一般定义包时最后一行为1;即表示包执行的最后结果为1。 $my_confcode 中的代码,最后一行的计算结果就是实际eval的结果。你可以在代码中把$my_confcode pint出来看看。 另外,帖子中说的问题,实际上可能你将一个变量作为哈希引用使用,然后,在取得引用时,却得到一个标量“1”,所以,程序执行出错。 应该是你对程序代码错误情况判断不足导致。
nanhaiyiou 2014-11-14
  • 打赏
  • 举报
回复
我也不知道$CONFFILE的内容是什么?
panghuhu250 2014-11-12
  • 打赏
  • 举报
回复
抱歉,我是说$CONFFILE的内容是什么?
nanhaiyiou 2014-11-12
  • 打赏
  • 举报
回复
confload就是使用eval函数读一个文件,取得值存入%ApacheStatGen %ApacheStatGen要保存的信息: $StatisticObj = MyApacheStatGen->new( 'verbose' => $ARG{'verbose'} ); $StatisticObj->set_path( 'apachelog', $ApacheStatGen{'LOG_PATH'} ); $StatisticObj->set_path( 'statfile', $ApacheStatGen{'STAT_PATH'} ); $StatisticObj->set_prefix( 'statfile', $ApacheStatGen{'STAT_PREFIX'} ); $StatisticObj->set_services( \%{ $ApacheStatGen{'SERVICE_LIST'} } ); $StatisticObj->set_expstr( \%{ $ApacheStatGen{'TARGETS'} } ); $StatisticObj->set_screens( \%{ $ApacheStatGen{'SCREENS'} } ); confload的内容就是上面的3---末尾的行数!
panghuhu250 2014-11-11
  • 打赏
  • 举报
回复
confload要做什么事?你想在%ApacheStatGen中保存什么样的信息?举个具体的例子:confload的内容是什么,你希望%ApacheStatGen的值是什么?
nanhaiyiou 2014-11-11
  • 打赏
  • 举报
回复
求高手解答,在线等!
my %ApacheStatGen;

%ApacheStatGen = %{ confload( $CONFFILE ) };

sub confload{
my $my_conffile = shift;

my $my_confcode = "";
my $my_returnconf;

print "my_conffile=[$my_conffile]\n";
die "$0: $my_conffile is not regular text file.\n" unless( -T $my_conffile );

open( FILEHANDLE, $my_conffile ) or die "$0: $my_conffile: $!\n";
flock( FILEHANDLE, 1 );
seek( FILEHANDLE, 0, 0 );
while( <FILEHANDLE> ){
$my_confcode .= $_;
}
close( FILEHANDLE );

print "my_confcode=[$my_confcode]\n";
$my_returnconf = eval( $my_confcode );

print "my_returnconf=[$my_returnconf]\n";
if( $@ ){
$@ =~ s/\s+$//s;
die "$0: $@\n";
};
print "my_returnconf=[$my_returnconf]\n";
return( $my_returnconf );
}
原代码如上!

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧