我有以下代码
#!/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
消息,但该文件与程序源文件存在于同一目录中。
答案 0 :(得分:6)
正如您所说,@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: $!";
答案 1 :(得分:1)
如果使用绝对路径
,问题就会消失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"