readdir()尝试了无效的dirhandle

时间:2017-06-22 20:43:47

标签: perl cgi opendir

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

{#}

2 个答案:

答案 0 :(得分:5)

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()尝试使用无效的dirhandle $ fh
  closedir()尝试使用无效的dirhandle $ fh

会引导你解决问题

根据您想要做的事情

,您可能会更好地使用其他功能

答案 1 :(得分:0)

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

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->new->utf8->decode()相同,只是更短。
  • 删除了return语句,因为它在子例程之外没有任何意义。如果此代码实际上已从子例程中拉出,那么您应该将其显示为MCVE的一部分。