【问题标题】:readdir() attempted on invalid dirhandlereaddir() 尝试在无效的目录句柄上
【发布时间】:2017-06-22 20:43:47
【问题描述】:

我做错了什么?我尝试了很多东西,但似乎无法从这个文件中读取。谢谢!

my $d = 'URLs.txt';
open(my $fh, '<:encoding(UTF-8)', $d)
#opendir(D, "$d") || die "Can't open directory $d: $!\n";
  or die "Can't open directory $d: $!\n";

my @list = readdir($fh);
closedir($fh);

foreach my $f (@list) {


my $json_data = get "$f";
my $json_obj = new JSON;
my $URLdata = $json_obj->decode($json_data);

  return $URLdata->{'status'} eq 'UP';
}

【问题讨论】:

  • $fh 是文件句柄,而不是目录句柄(如错误消息所述)。您不能在文件句柄上 readdir。你到底想做什么?
  • @MattJacob:警告未启用,因此没有错误消息。

标签: perl cgi opendir


【解决方案1】:

URLs.txt 似乎是一个文件,而不是一个目录

要打开一个文件,写

open my $fh, '<', $filename or die $!;

并从中读取

while ( my $line = <$fh> ) { ... }

要打开一个目录,写

opendir my $dh, $dirname or die $!;

并阅读其内容

while ( my $item = readdir $dh ) { ... }

如果您在编写的每个 Perl 程序中都有 use strictuse warnings 'all',那么您会看到

readdir() 尝试对无效的目录句柄 $fh
closedir() 尝试在无效的目录句柄 $fh 上

这会引导你解决问题

你可能会更好地使用其他功能,这取决于你想要做什么

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

委婉地说,你的变量名不是很好。让我们解决这个问题!

use strict;
use warnings;

use JSON;
use LWP::Simple;

my $file = 'URLs.txt';

open(my $fh, '<:encoding(UTF-8)', $file) or die "Can't open file $file: $!\n";
chomp(my @lines = <$fh>);
close($fh);

foreach my $url (@lines) {
    my $json_text = get($url);

    if (defined($json_text)) {
        my $perl_ref = decode_json($json_text);

        if ($perl_ref->{status} eq 'UP') {
            print "foo\n";
        }
    } else {
        # handle the error!
    }
}

你也会注意到我:

  • 添加了use strictuse warnings,它们应该在您编写的每个 Perl 文件中
  • 为 LWP get() 结果添加了错误检查
  • 删除了间接对象表示法 (new JSON) 以支持 decode_json() 便利功能。与JSON-&gt;new-&gt;utf8-&gt;decode() 相同,只是更短。
  • 删除了return 语句,因为它在子例程之外没有任何意义。如果此代码实际上已从子例程中提取,那么您应该将其显示为 MCVE 的一部分。

【讨论】:

  • 感谢您的回复!我想做的是从另一个 javascript 调用这个 perl 脚本并返回布尔值。你知道这是否可能吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2019-08-23
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多