2010-12-13 17 views
1

Zuerst habe ich die Foren gesucht und nicht genau mein Problem gefunden. Ich benutze Ubuntu mit Perl 5.10 installiert.Kann einen undefinierten Wert nicht als Dateihandle-Referenz verwenden

Ich erhalte den folgenden Fehler nach meinem Skript ausführen:

"Can't use an undefined value as filehandle reference at scraper.pl line 17" 

Hier ist mein Skript ....

#!/usr/bin/perl -W 
use strict; 
use warnings; 

use WWW::Curl::Easy; 


my $curl = WWW::Curl::Easy->new; 

$curl->setopt(CURLOPT_HEADER, 1); 
$curl->setopt(CURLOPT_URL, 'http://something.com'); 


my $response_body; 
$curl->setopt(CURLOPT_WRITEDATA,\$response_body); 

my $return_code = $curl->perform; 

if ($return_code == 0) 
{ 
    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); 
    print ("Success ".$response_code); 
} 
else 
{ 
    # Error Code 
    print ("An error occured: ".$return_code." ".$curl->strerror($return_code)." ".$curl->errbuf."\n"); 
} 

# EOF 

Alle hier Hilfe wäre sehr geschätzt.

Danke,

Ben

+0

wo erhalten Sie den Fehler? – KevinDTimm

+0

@Kevin at scraper.pl Zeile 15.;) – bzlm

+0

Sorry ... der Fehler tritt in Zeile 15 auf ... my $ return_code = $ curl-> ausführen; – Bnjmn

Antwort

6

Anstelle von:

my $response_body; 
$curl->setopt(CURLOPT_WRITEDATA,\$response_body); 

tun:

my $response_body = ''; 
open(my $fileb, ">", \$response_body); 
$curl->setopt(CURLOPT_WRITEDATA,$fileb); 

Wenn Sie die Dokumentation für die Version von WWW-Curl-überprüfen Sie tatsächlich installiert haben, ich glaube, Sie werden sehen, es geht Dateihandle, keine Skalarreferenz.

Alternativ, WWW-Curl aktualisieren.

Beachten Sie auch, dass -W nicht generell ratsam ist; oft Module deaktivieren Warnungen für einen bestimmten Bereich und der Hauptstadt W-Schalter verhindert dies. Verwenden Sie -w stattdessen (oder nur use warnings; für Ihren eigenen Code, den Sie bereits tun).

+0

Fragen Sie einfach ... warum hat die Community diesen Kommentar zu einer Lösung ausgewählt, wenn die von mir als Lösung des Problems bezeichnete Lösung unpopulär bleibt? – Bnjmn

+0

@Bnjmn: bei einer Vermutung, weil der andere Ihnen eine Umgehungslösung bietet, nachdem Sie die falsche Dokumentation gelesen haben, anstatt zu erklären, dass Sie das getan haben? – ysth

+0

Auch mit curl, um etwas in eine temporäre Datei zu bekommen, ist ein wenig seltsam. – ysth

0

Es ist schlechter Code an:

print ("Success ".$response_code); 

Blick in der Dokumentation für print: Durch die Art und Weise Argumente analysiert werden, wenn Sie Klammern verwenden, das erste Argument wird als ein Dateihandle interpretiert, der nicht ist, was Sie beabsichtigten. In Ihrem Code sind die Klammern nicht erforderlich. Pass nur eine verkettete Zeichenfolge, oder besser, vermeiden Sie die Verkettung und eine Liste von Strings übergeben:

print 'Success ', $response_code; 

bitte auch bitte immer auch use strict; use warnings; an der Spitze des jedes Skript schreiben. Sie werden feststellen, dass viele Fehler hervorgehoben sind, die sonst für eine lange Zeit verborgen bleiben könnten, und es spart außerdem Zeit, wenn Sie einen Fehler bemerken, bevor Sie bei Stack Overflow nachfragen müssen. :)

+0

Das ist aber in Zeile 20. – Quentin

+0

Danke für die Eingabe ... ein echter Amateur Fehler :( – Bnjmn

+0

@Bnjmn: nicht wenn diese Zeile nie ausgeführt wird:: p – Ether

0
my $response_body; 
$curl->setopt(CURLOPT_WRITEDATA,\$response_body); 

Sie $response_body deklariert haben, aber haben keinen Wert zugewiesen. Ich nehme an, dass dies funktionieren würde, wenn Sie es zu einer Zeichenfolge machen würden.

Das gesagt, ich kann nicht sicher sein, da ich den Fehler nicht reproduzieren kann. Vielleicht hilft auch die Installation einer neueren Version des Moduls.

+0

Vielen Dank für diese Antwort, ich weiß, Perl ist besonders großzügig in Bezug auf variable Initialisierung und so die Lösung, die Sie vorgeschlagen haben, das Problem nicht zu lösen Ich habe auch die neueste Version der heruntergeladen Curl-Modul und stellte sicher, dass mein Perl-Interpreter auch ziemlich neu war, da vorherige Posts in den Foren Probleme mit älteren Perl-Versionen berichteten. Schnelle Aktualisierung, wenn ich $ response_body in die leere Zeichenfolge ändere, ändert sich der Interpreter-Fehler und sagt "Bad Dateihandle: at scraper.pl Zeile 15 " – Bnjmn

+0

Aus diesem Kommentar, ist es nicht möglich, dass $ curl-> setopt ein Dateihandle als zweites Argument und nicht als Verweis auf einen Skalar erwartet? Wenn es Ihnen nichts ausmacht, versuchen Sie dies: öffnen Sie meine $ fh, '>', \ $ response_body oder sterben "$!"; $ curl-> setopt (CURLOPT_WRITEDATA, $ fh); EDIT: Die Docs implizieren, dies sollte jedoch keine Rolle spielen. – Hugmeir

+0

@Hugmeir: aber er überprüft die neuesten Dokumente, nicht die Dokumente der Version, die er hat. 4.11 benötigt mindestens ein Dateihandle, kein Skalar-Ref. – ysth

2
#!/usr/bin/perl 
use strict; 
use warnings; 

use WWW::Curl::Easy; 
use File::Temp qw/tempfile/; 

my $response_body = tempfile(); 

my $curl = WWW::Curl::Easy->new; 

$curl->setopt(CURLOPT_HEADER, 1); 
$curl->setopt(CURLOPT_URL, 'http://yiddele.com/categoryindex.aspx'); 

#$curl->setopt(CURLOPT_WRITEDATA,\$response_body); 
$curl->setopt(CURLOPT_WRITEDATA, \$response_body); 

my $return_code = $curl->perform; 

if ($return_code == 0) 
{ 
    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); 
    print ("Success ".$response_code); 
} 
else 
{ 
    # Error Code 
    print ("An error occured: ".$return_code." ".$curl->strerror($return_code)." ".$curl->errbuf."\n"); 
} 

# EOF 

Ausgang ist:

Success 200
+0

danke d5e5, du hast das Problem behoben. Deine Hilfe ist sehr Willkommen. – Bnjmn

+0

Dieser Beitrag wurde als vorgeschlagene Lösung zurückgestuft, da er eine etwas peinliche Problemumgehung darstellt, jedoch immer noch die beabsichtigten Ergebnisse liefert, also habe ich dafür gestimmt. – Bnjmn

+0

Dank Bnjmn. Nachdem ich das oben Gesagte gepostet habe, habe ich gesehen, dass du 4 Minuten zuvor eine Antwort gepostet hast, für die ich gestimmt habe, weil sie eine Erklärung enthielt. Außerdem hatte ich noch nicht die Curl.pm-Datei gesehen, die zusammen mit WWW :: Curl :: Easy installiert wurde, eine Ebene höher als der Curl-Ordner mit Easy.pm. Es enthält Beispiele mit den verschiedenen Methoden, einschließlich perform. – d5e5

0
 use Data::Printer ; 
     use URI::Encode qw(uri_encode uri_decode); 
     use JSON(); 
     use JSON::Parse ':all' ; 
     use WWW::Curl; 
     use HTTP::Response ; 

     use utf8 ; 
     use Carp ; 
     use Cwd qw (abs_path) ; 
     use Getopt::Long; 

     use WWW::Curl::Easy; 

     my $curl = WWW::Curl::Easy->new; 
     $curl->setopt(WWW::Curl::Easy::CURLOPT_HEADER(),1); 
     $curl->setopt(WWW::Curl::Easy::CURLOPT_URL(), 'https://www.pivotaltracker.com/services/v5/me?fields=%3Adefault'); 
     $curl->setopt(WWW::Curl::Easy::CURLOPT_HTTPHEADER() , ['X-TrackerToken: ' . $TOKEN] ); 
     #$curl->setopt(WWW::Curl::Easy::CURLOPT_POST(), 1); 

     # A filehandle, reference to a scalar or reference to a typeglob can be used here. 
     my $response_body; 
     $curl->setopt(WWW::Curl::Easy::CURLOPT_WRITEDATA(),\$response_body); 

     # Starts the actual request 
     my $ret = $curl->perform; 


     if ($ret == 0) { 

       print("Transfer went ok\n"); 
       my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); 
       # judge result and next action based on $response_code 

       $response_body = HTTP::Response->parse($response_body); 
       print("Received response: $response_body\n"); 
       p($response_body); 
       my $json_data = $response_body->content ; 

       $json_data = JSON->new->utf8->decode($json_data); 
       p($json_data); 

     } else { 
      # Error code, type of error, error message 
       print("An error happened: $ret ".$curl->strerror($ret)." ".$curl->errbuf."\n"); 
     } 

     # my $cmd='curl -X GET -H "X-TrackerToken: ' . "$TOKEN" . '" "https://www.pivotaltracker.com/services/v5/me?fields=%3Adefault"' ; 
     # my $json_str = `$cmd`; 
     # p($json_str); 
     # my $json_data = JSON->new->utf8->decode($json_str); 
     # p($json_data); 
Verwandte Themen