Perl 无法理解Tie::文件失败的原因

Perl 无法理解Tie::文件失败的原因,perl,Perl,我有以下代码 #!/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\u id[0],但仍然没有结果:/ 我安装了最新的ActiveP

我有以下代码

#!/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\u id[0]
,但仍然没有结果:/

我安装了最新的ActivePerl

编辑:


现在我收到
无法打开此文件的消息,但该文件与程序源文件位于同一目录中。

正如您所说,
@last\u id[0]
是错误的,应该是
$last\u id[0]
。但这不会导致你看到的问题

请注意,程序不会在与Perl源文件相同的目录中查找
last_id.txt
,除非它也是当前工作目录

首先,您应该将
tie
行中使用的错误变量更改为
$像这样

tie my @last_id, 'Tie::File', 'last_id.txt'
    or die "Unable to open this file: $!";
tie my @last_id, 'Tie::File', 'last_id.txt', mode => O_RDONLY
    or die "Unable to open this file: $!";
因为变量
$i
不包含任何有用的内容。这将告诉您
tie
失败的原因,可能不是没有这样的文件或目录

您还应该在程序开始时
使用strict
使用warnings
,因为这将标记容易忽略的简单错误

最后,尝试通过向文件名添加绝对路径来完全限定文件名。这将解决程序在默认情况下查找错误目录的问题


更新

如果问题是您没有对该文件的写访问权限,则可以通过以只读方式打开该文件来修复它

您需要使用
Fcntl
模块来定义
orduonly
常量,因此将其放在程序的顶部

use Fcntl 'O_RDONLY';
然后,
tie
语句如下

tie my @last_id, 'Tie::File', 'last_id.txt'
    or die "Unable to open this file: $!";
tie my @last_id, 'Tie::File', 'last_id.txt', mode => O_RDONLY
    or die "Unable to open this file: $!";

如果使用绝对路径,问题应该会消失

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"

重要的是从哪个目录运行。尝试使用perl中的absolute path.im complete newbie,我应该将其粘贴到哪里?它给出了第4行的“权限被拒绝”。这解决了您的问题吗?如果您只需要对文件进行读取访问,但由于您没有写入权限,
tie
失败,则可以以只读方式打开该文件。我已经更新了我的答案来解释它是如何工作的。感谢大家的回答,我最终把它放在了绝对路径上。当我执行
$absolute_path='C:\Users\…\Desktop\'时,还有一件事要做tie my@last_id,'tie::File','$absolute_path\last_id.txt'它没有打开,并且说找不到文件。为什么会发生这种情况?我肯定文件在那里。当我在连接线中键入绝对路径时,它工作正常。因为单引号不允许在字符串中插入变量,并且您正在将字符串
$absolute\u path\last\u id.txt
作为文件名传递。小心使用反斜杠,因为即使在单个带引号的字符串中,反斜杠也会占用结束引号。您可能希望使用前向斜杠,因为Perl对Windows上的前向斜杠和前向斜杠都很满意。