grasshopper!!! has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to loop through yahoo finance csv files and print each csv to format text files using same format but I lose headers from all but first file. How can I force a header on all files just once.I've tried changing the file handle to a variable localizing $- and $% but to no avail. thank you

#!/usr/bin/perl -w use LWP::Simple; for $i (O..Q) { my $url="http://eoddata.com/stocklist/NASDAQ/".$i.".htm"; my $str = get($url) or die "Couldn't get it!" unless defined $str; print "got\n"; my @array = ($str =~ m/.+?Chart for NASDAQ,\w+?">(.+?)<\/A><\/td><td>( +.+?)<\/td><td align=right>(\d+?\.\d+?)<\/td><td align=right>(\d+?\.\d ++?)<\/td><td align=right>(\d+?\.\d+?)<\/td><td align=right>(\d+?,?\d+ +?,?\d+?)<\/td><td align="right">(-?\d+?\.\d+?)<\/td><td align="center +"><IMG.+?><\/td><td align="left">(-?\d+?\.\d+?)<\/td>.+?/gi); open (FH,">","nasdaq_list_format".$i.".txt") or die "oops $!\n"; local $%=0; local $-=0; my $s= @array/8+5; #FH->format_lines_per_page($s); format FH_TOP= SYMBOL Name High Low + Close Volume Change +/- ---------------------------------------------------------------------- +--------------------------------------------------- . format FH = @<<<<< @<<<<<<< @###.##### @###.#### @### +.#### @||||||||||| @###.### @##.## $m,$n,$o,$p,$q,$r,$s,$t . while ( ($m,$n,$o,$p,$q,$r,$s,$t) = splice (@array,0,8)) { write FH; } close(FH); }

Replies are listed 'Best First'.
Re: format trouble
by Athanasius (Archbishop) on Oct 18, 2015 at 04:49 UTC

    Hello grasshopper!!!,

    Anonymous Monk may well be right to recommend that you change to Perl6::Form, but in the meantime what you are trying to do is quite possible with format:

    #! perl use strict; use warnings; use LWP::Simple; my @data; format NASDAQ_HEADER = SYMBOL Name High Low + Close Volume Change +/- ---------------------------------------------------------------------- +--------------------------------------------------- . format NASDAQ_FORMAT = @<<<<< @<<<<<<< @###.##### @###.#### @### +.#### @||||||||||| @###.### @##.## @data . for my $i ('O' .. 'Q') { # Retrieve data from URL my $url = 'http://eoddata.com/stocklist/NASDAQ/' . $i . '.htm'; my $str = get($url) or die "Cannot get URL '$url': $!"; print "Retrieved URL: $url\n"; my @array = ($str =~ m/.+?Chart for NASDAQ,\w+?">(.+?)<\/A><\/td>< +td>(.+?)<\/td><td align=right>(\d+?\.\d+?)<\/td><td align=right>(\d+? +\.\d+?)<\/td><td align=right>(\d+?\.\d+?)<\/td><td align=right>(\d+?, +?\d+?,?\d+?)<\/td><td align="right">(-?\d+?\.\d+?)<\/td><td align="ce +nter"><IMG.+?><\/td><td align="left">(-?\d+?\.\d+?)<\/td>.+?/gi); # Prepare output file and format my $out = 'nasdaq_list_format' . $i . '.txt'; open(my $fh, '>', $out) or die "Cannot open file '$out' for writin +g: $!"; my $ofh = select $fh; # Select filehandle for write( +) local $^L = ''; # Suppress form feed local $% = 1; # Set current page number local $^ = 'NASDAQ_HEADER'; # Set format header local $~ = 'NASDAQ_FORMAT'; # Set format local $= = @array / 8 + 5; # Set lines per page # Write formatted output to file write $fh while @data = splice @array, 0, 8; # Tidy up close $fh or die "Cannot close file '$out': $!"; select $ofh; # Restore old filehandle (STDI +N) }

    Some notes:

    • The key change is to select the filehandle for the subsequent write statement, and to set $^, $~, etc., to their appropriate values. Note that when $^ and $~ are set explicitly, the format names don’t need to match the filehandle name.

    • Using format is no excuse not to use strict and lexical variables (including a lexical filehandle)!

    • Whenever you see something like ($m,$n,$o,$p,$q,$r,$s,$t) =, think: “That should be an array.”

    • The line:

      my $str = get($url) or die "Couldn't get it!" unless defined $str;

      generates a warning, because $str is evaluated in the unless condition before it’s declared. It’s probably just a typo; but, for the record, the unless clause is redundant here.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Thanks for your quick help, very grateful. grasshopper!!!

Re: format trouble (Perl6::Form)
by Anonymous Monk on Oct 18, 2015 at 01:30 UTC
    Yes, the problem is you're using formats ;D try Perl6::Form instead, its just a regular function call, no special global vars, just form( $format, $var, $format, $var... )

      Will do thanks.grasshopper!!!