我有以下代码
#!/usr/bin/perl
use Tie::File;
tie my @last_id, 'Tie::File', 'last_id.txt' or die "Unable to open this file !$i";
print @last_id[0];
exit;还有一个名为last_id.txt的文件,其中包含以下内容
1
2
3
4
5
6当我运行这个程序时,什么也没有输出。我尝试了$last_id[0],但仍然没有结果。:/
我安装了最新的ActivePerl。
编辑:
现在我收到了Unable to open this file消息,但该文件与程序源文件存在于同一目录中。
发布于 2012-06-15 14:15:25
正如您所说,@last_id[0]是错误的,应该是$last_id[0]。但这不会导致您看到的问题。
请注意,程序不会在与Perl源文件相同的目录中查找last_id.txt,除非它也在当前工作目录中。
首先,应该将tie行中使用的错误变量更改为$!,如下所示
tie my @last_id, 'Tie::File', 'last_id.txt'
or die "Unable to open this file: $!";因为变量$i不包含任何有用的东西。这将告诉您tie失败的原因,可能是因为没有这样的文件或目录。
您还应该在程序开始时使用use strict和use warnings,因为这将标记出容易忽略的简单错误。
最后,尝试通过向文件名添加绝对路径来完全限定文件名。这将解决默认情况下程序在错误的目录中查找的问题。
更新
如果问题是您对文件没有写访问权限,那么您可以通过以只读方式打开它来修复它。
您需要使用Fcntl模块来定义O_RDONLY常量,因此请将此代码放在程序的顶部
use Fcntl 'O_RDONLY';然后,tie语句如下所示
tie my @last_id, 'Tie::File', 'last_id.txt', mode => O_RDONLY
or die "Unable to open this file: $!";发布于 2012-06-15 14:15:53
如果使用绝对路径,这个问题应该会消失。
BEGIN {
use File::Spec;
use File::Basename qw' dirname ';
use vars qw' $thisfile $thisdir ';
$thisfile = File::Spec->rel2abs(__FILE__);
$thisdir = dirname($thisfile);
}
...
tie ... "$thisdir/last_id.txt"https://stackoverflow.com/questions/11045403
复制相似问题