首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法理解Tie::文件失败的原因

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

Stack Overflow用户
提问于 2012-06-15 14:04:16
回答 2查看 945关注 0票数 2

我有以下代码

代码语言:javascript
运行
复制
#!/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的文件,其中包含以下内容

代码语言:javascript
运行
复制
1
2
3
4
5
6

当我运行这个程序时,什么也没有输出。我尝试了$last_id[0],但仍然没有结果。:/

我安装了最新的ActivePerl。

编辑:

现在我收到了Unable to open this file消息,但该文件与程序源文件存在于同一目录中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-15 14:15:25

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

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

首先,应该将tie行中使用的错误变量更改为$!,如下所示

代码语言:javascript
运行
复制
tie my @last_id, 'Tie::File', 'last_id.txt'
    or die "Unable to open this file: $!";

因为变量$i不包含任何有用的东西。这将告诉您tie失败的原因,可能是因为没有这样的文件或目录。

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

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

更新

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

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

代码语言:javascript
运行
复制
use Fcntl 'O_RDONLY';

然后,tie语句如下所示

代码语言:javascript
运行
复制
tie my @last_id, 'Tie::File', 'last_id.txt', mode => O_RDONLY
    or die "Unable to open this file: $!";
票数 6
EN

Stack Overflow用户

发布于 2012-06-15 14:15:53

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

代码语言:javascript
运行
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11045403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档