2011-09-22 3 views
5

मैं दो फाइलों को लिख रहा हूं, एक लॉग_मेसेज फ़ंक्शन का उपयोग करके एक लॉग और दूसरा मेरे file_write फ़ंक्शन के भीतर लिख रहा है और मैं लाइन से इसे लाइन लिखना चाहता हूं और buffered नहीं होना चाहिए ताकि यह रेखा से लाइन लिख सके और सभी में नहीं एक स्क्रिप्ट के अंत में जाओ।

मैंने बफरिंग और फ़ाइलहेडल को गर्म करने के बारे में पढ़ा है लेकिन मेरा कोड काम करने के लिए नहीं मिल सकता है।

इस उदाहरण में मैंने $|=1; को foreach लूप से पहले जोड़ा है लेकिन यह अभी भी एक बार में लिखता है। क्या मैं वास्तव में कुछ गूंगा कर रहा हूँ?

यदि मेरी सहायता करता है तो मैंने अपनी पूरी लिपि को आगे बढ़ा दिया है।

#----------------------------------------------- 
    sub file_write { 
    #----------------------------------------------- 
    open OUT, ">>$OUT" or Log_message ("\n$DATE - $TIME - ERROR - Could not create filelist.doc \t"); 
    Log_message ("\n$DATE - $TIME - INFO - Opened the output file"); 
    my $total = scalar keys %{ $doc->{ resource } }; 
    Log_message ("\n$DATE - $TIME - INFO - Found: " . $total . " resources"); 
    #printf "resources: %s\n", scalar keys %{ $doc->{ resource } }; 

    $|=1; 

    #And I have also tried: 

    #use IO::Handle; 
    #STDOUT->autoflush(1); 

    foreach (keys %{ $doc->{ resource } }) { 
     #print OUT $doc->{ resource }->{ $_ }->{ id }, "\n"; 
     my $ID = $doc->{ resource }->{ $_ }->{ id }, "\n"; 
     Log_message ("\n$DATE - $TIME - INFO - Found: " . $ID); 
     my $testurl = "http://dronlineservices.letterpart.com/web/content.xql?action=doc_html&lang=en&pub=" . $pubId . "&docid=" . $ID; 
     print OUT "$testurl\n"; 
     sleep 1; 

    } 

और पूरी स्क्रिप्ट

# !c:/Perl/bin/Perl.exe 


#----------------------------------------------- 
#Modules 
#----------------------------------------------- 
use XML::Simple; 
use LWP; 
use Data::Dumper; 
$Data::Dumper::Indent = 1; 
$Data::Dumper::Sortkeys = 1; 
use strict; 
use warnings; 

#----------------------------------------------- 
#Declare variables 
#----------------------------------------------- 
    my $script = "LiveContent Auto Cache Script"; # Name of the script 
    my $version = "Version 0.1"; 
    #my $pubId = "COMP-20110922XXXX"; 
    my $pubId = "LiveContentDoc";  
    my $OUT = "output.txt"; 
    my $LOG = "cacher-log.log";  # Location of log file 
    my $DATE;             # Date in form 2001-sep-01 
    my $DATENR;            # Date in form 2001-01-09 
    my $TIME;            # Time in form 12:04:03 
    my $txtmesg = ""; 
    my $resource; 
    my $xs; 
    my $doc; 

#################################### 
########### Main Program ########### 
#################################### 
error_logger();        # Open Log file and time stamp it 
request_url(); #Open the xml url and read it in 
file_write(); #write the contents of the xml url to a file 


#----------------------------------------------- 
sub request_url { 
#----------------------------------------------- 
my $useragent = LWP::UserAgent->new; 
my $request = HTTP::Request->new(GET => "http://digitalessence.net/resource.xml"); 
#my $request = HTTP::Request->new(GET => "http://dronlineservices.letterpart.com/web/content.xql?action=index&lang=en&pub=" . $pubId); 
$resource = $useragent->request($request); 
$xs   = XML::Simple->new(); 
$doc  = $xs->XMLin($resource->content); 

} 


#----------------------------------------------- 
sub file_write { 
#----------------------------------------------- 
open OUT, ">>$OUT" or Log_message ("\n$DATE - $TIME - ERROR - Could not create filelist.doc \t"); 
Log_message ("\n$DATE - $TIME - INFO - Opened the output file"); 
my $total = scalar keys %{ $doc->{ resource } }; 
Log_message ("\n$DATE - $TIME - INFO - Found: " . $total . " resources"); 
#printf "resources: %s\n", scalar keys %{ $doc->{ resource } }; 



use IO::Handle; 
STDOUT->autoflush(1); 

foreach (keys %{ $doc->{ resource } }) { 
    #print OUT $doc->{ resource }->{ $_ }->{ id }, "\n"; 
    my $ID = $doc->{ resource }->{ $_ }->{ id }, "\n"; 
    Log_message ("\n$DATE - $TIME - INFO - Found: " . $ID); 


    my $testurl = "http://dronlineservices.letterpart.com/web/content.xql?action=doc_html&lang=en&pub=" . $pubId . "&docid=" . $ID; 
    print OUT "$testurl\n"; 


     # my $browser = LWP::UserAgent->new; 
     # $browser->timeout(240); 
     # $browser->env_proxy; 
     # $browser->agent('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'); 

      # my $response = $browser->get($testurl); 

     # if ($response->is_success) { 
      #  print "\n############################\n"; 
      #  print "$testurl\n"; 
      #  print "\n############################\n"; 
       # print $response->decoded_content; # print the response out 
      # } 
      # else { 
      # my $error = $response->status_line; 
      #  Log_message ("\n$DATE - $TIME - WARN - Can't load $ID because: $error"); 
      # die $response->status_line; 

     # } 



    #my $loadrequest = $ua->get('http://dronlineservices.letterpart.com/web/content.xql?action=doc_html&lang=en&pub=" . $pubId . "&docid=" . $ID'); 
    sleep 1; 

} 


Log_message ("\n$DATE - $TIME - INFO - Written the output file"); 
#close(OUT) or Log_message ("\n$DATE - $TIME - WARN - Failed to close the Output file"); 
Log_message ("\n$DATE - $TIME - INFO - Closed the output file"); 
} 
#----------------------------------------------- 
sub error_logger { 
#----------------------------------------------- 
    time_stamp();                                # Run Time stamp sub 
    open LOG, ">>$LOG" or die ("could not open log file <$LOG>");        # Open Log File 
    Log_message ("\n$DATE - $TIME - -----------------------------------------\ \t"); 
     Log_message ("\n$DATE - $TIME - INFO - Start of Application\ \t"); 
     Log_message ("\n$DATE - $TIME - INFO - $script\ \t"); 
     Log_message ("\n$DATE - $TIME - INFO - $version\ \t"); 
     Log_message ("\n$DATE - $TIME - -----------------------------------------\ \t"); 

} 
#------------------------------------------------------------- 
sub Log_message { 
#------------------------------------------------------------- 
    time_stamp();     # Run time_stamp every time the log is written to 
    my($mesg) = @_; 
    print LOG $mesg if $LOG; # Print to log file 
    print $mesg;    # Print to Screen 
    $txtmesg = $mesg; 
    #print "\nLOGGING: $txtmesg\n"; 
} 
#----------------------------------------------- 
sub time_stamp { 
#----------------------------------------------- 
    my($Sec,$Min,$Hour,$Day,$MonthNr,$Year) = localtime(time()); 
    my $Month=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")[$MonthNr]; 
    $Sec = sprintf("%02d",$Sec); 
    $Min = sprintf("%02d",$Min); 
    $Day = sprintf("%02d",$Day); 
    $MonthNr = sprintf("%02d",++$MonthNr); 
    $Year = 1900 + $Year; 
    $DATE = "$Year-$Month-$Day"; 
    $DATENR = "$Year-$MonthNr-$Day"; 
    $TIME = "$Hour:$Min:$Sec"; 
} # end sub 

उत्तर

16

आप पहली बार संभाल चयन करने के लिए भूल गया था।

select((select(OUT), $| = 1)[0]); 
+4

कोड की इस पंक्ति के बारे में कुछ स्पष्टीकरण प्राप्त करने के लिए, एक अच्छा पढ़ा प्रलेखन ('perldoc perlvar') है: _ अगर nonzero पर सेट किया गया है, तो वर्तमान में चयनित ** आउटपुट चैनल पर तुरंत एक फ्लश को मजबूर करता है और प्रत्येक लिखने या प्रिंट ** के बाद **_ –

+0

आपको बहुत धन्यवाद। अब इसे और अधिक समझने के लिए दस्तावेज़ों को पढ़ने के लिए! –

+9

आईओ :: हैंडल का उपयोग करें; आउट-> ऑटोफ्लश (1); –

11
use IO::Handle; 
OUT->autoflush(1); 

लेकिन यह शाब्दिक filehandles उपयोग करने के लिए बेहतर है: आदेश में

use IO::Handle; 
open my $outfh, ">>", $OUT or Log_message ("\n$DATE - $TIME - ERROR - Could not create filelist.doc \t"); 
$outfh->autoflush(1); 
+1

thatsawfullyhardtoreadwithoutanyparens अधिक पढ़ने योग्य है। इसके अलावा सवाल ने '$ |' सही तरीके से उपयोग करने के तरीके के बारे में पूछा। आपका उत्तर उस पते को संबोधित नहीं करता है। अंत में, आप लेक्सिकल फाइलहेडल कहते हैं लेकिन इसका मतलब यह नहीं है। आपका मतलब स्वाभाविक हैंडल है। – tchrist

+3

@ क्रिसमस, निश्चित रूप से यह करता है। '$ |' का उपयोग करने का सही तरीका इसे 'autoflush' के माध्यम से उपयोग नहीं करना है। – ikegami

+0

@ikegami यह "सही" की एक सुंदर मूर्खतापूर्ण भावना है। '$ |' को बहिष्कृत नहीं किया गया है, और यह किसी का भी नाटक करने के लिए कोई अच्छा नहीं है। – tchrist

संबंधित मुद्दे