【发布时间】:2017-11-11 06:48:09
【问题描述】:
我在 Perl 中有以下关于文件处理程序访问的查询。
考虑以下描述确切场景的代码 sn-p。
Main.pl
#!/usr/bin/perl -w
use warnings;
use strict;
use strict 'refs';
use File::Basename;
use Fcntl ':flock';
use feature qw/say switch/;
use File::Spec::Functions;
use File::Find;
require( "/home/rxa3kor/Mastering_Perl/sample.pm" );
our $LOGFILE = "sample";
open( LOGFILE, ">$LOGFILE" ) or die "__ERROR: can't open file\n'", $LOGFILE, "'!\n";
flock( LOGFILE, LOCK_EX );
print LOGFILE ( "Tool Start\n" );
&sample::func();
flock( LOGFILE, LOCK_UN );
close( LOGFILE );
sample.pm
#!/usr/bin/perl -w
package sample;
sub func() {
print $main::LOGFILE ( "Printing in subroutine\n" );
}
当我执行上述代码 sn-p 时,出现以下错误。
print() 在 /home/rxa3kor/Mastering_Perl/sample.pm 第 6 行的未打开文件句柄 Mastering 上。
这个错误是因为文件句柄LOGFILE 在sample.pm 模块下不可见。
如何实现这个概念?
我想在Main.pl 中打开一个文件,我需要这个文件句柄可以在不同的 Perl 模块中访问。
【问题讨论】:
-
我认为这不是您使用的代码。此代码无法编译。您在
use File::Find行的末尾缺少一个分号。一旦我解决了这个问题,我就会遇到另一个问题,因为您没有在主程序中加载sample.pm。请不要浪费我们的时间在我们必须修复此类简单错误的地方发布示例代码。 -
另外两个错误。
sample.pm不返回真值。此示例代码和您引用的错误消息之间的文件名不同。 -
基本上我想知道我们是否可以在 main.pl 下打开一个文件,我需要这个文件句柄可以在不同的 Perl 模块中访问。
-
这和你问的问题无关,但是你认为当你以
'>'模式打开你的日志文件,然后发现你无法获得排他锁时会发生什么因为别人把它锁了? -
提示:Clobber 输出模式会在你获得锁之前破坏输出文件。这意味着如果其他人已经用锁打开了文件,那么您只是破坏了他们。
标签: perl module filehandle