मैं दो फाइलों को लिख रहा हूं, एक लॉग_मेसेज फ़ंक्शन का उपयोग करके एक लॉग और दूसरा मेरे 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
कोड की इस पंक्ति के बारे में कुछ स्पष्टीकरण प्राप्त करने के लिए, एक अच्छा पढ़ा प्रलेखन ('perldoc perlvar') है: _ अगर nonzero पर सेट किया गया है, तो वर्तमान में चयनित ** आउटपुट चैनल पर तुरंत एक फ्लश को मजबूर करता है और प्रत्येक लिखने या प्रिंट ** के बाद **_ –
आपको बहुत धन्यवाद। अब इसे और अधिक समझने के लिए दस्तावेज़ों को पढ़ने के लिए! –
आईओ :: हैंडल का उपयोग करें; आउट-> ऑटोफ्लश (1); –