2017-06-22 25 views
-5

我在做什麼錯?我嘗試了很多東西,但似乎無法從這個文件中讀取。謝謝!readdir()試圖在無效的dirhandle上

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'; 
} 
+2

'$ fh'是一個文件句柄,而不是一個dirhandle(如錯誤消息所示)。您不能在文件句柄上使用「readdir」。你究竟在做什麼? –

+0

@MattJacob:警告沒有啓用,所以沒有錯誤信息。 – Borodin

回答

5

URLs.txt似乎是一個文件,而不是一個目錄

要打開文件,寫

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

,並從中讀取

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

要打開目錄,寫

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

,如果你在的地方有use strictuse warnings 'all',你應該在你寫你要每個Perl程序與

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

讀取其內容看到

readdir()試圖對無效的dirhandle $ fh
closedir()試圖對無效DIRHANDLE $ FH

這將引導你走向問題

您可能會與其他功能,這取決於它是什麼你想要做

+0

謝謝你的幫助! – Kevin

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的一部分。
+0

謝謝你的迴應!我想要做的是從另一個JavaScript調用這個perl腳本並返回布爾值。你知道這是可能的嗎? – Kevin