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

Can someone please provide me with a (working) example of how to set and use multiple formats when writing to a file? I managed to get it to work writing to STDOUT (how, I don't know), but not when I've opened a new file for output.

Here's the bare-bones outline of what I'm attempting.

open (REPORT,">$filename") || die "error"; ... $^ = "NEWPAGE"; ... foreach [outer loop] $~ = "FIRST_FORMAT"; write (REPORT); foreach [inner loop] $~ = "SECOND_FORMAT"; write (REPORT); [end inner loop] [end outer loop] close (REPORT) || die ...

I have tried various forms and combinations of select, including

$oldHandle = select (REPORT); $~ = [format reference] select $oldHandle;

and nothing seems to work. The best I can do appears to be one pass through each loop, with the following error messages:

write() on closed filehandle REPORT at script line xxx [repeated several times] Cannot close <filename> (Bad file descriptor)

Please note in your answers I'm not a programmer - I'm an engineer who simply uses perl to make my life easier.

Replies are listed 'Best First'.
Re: Using multliple formats when writing to a file
by hippo (Archbishop) on Jun 06, 2014 at 17:01 UTC

    Using FileHandle as recommended in the perlform documentation works for me:

    #!/usr/bin/perl -w use strict; use warnings; use FileHandle; open my $fh, '>', '/tmp/output.txt' or die $!; my $data = 'This is a test'; format LEFT = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $data . format RIGHT = @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $data . format_name $fh "LEFT"; write ($fh) or die $!; format_name $fh "RIGHT"; write ($fh) or die $!; close ($fh) or die $!; exit;
    Please note in your answers I'm not a programmer - I'm an engineer who simply uses perl to make my life easier.

    The easier you want your life to be, the more you will use perl and therefore the more you will become a programmer.

    :-)

Re: Using multliple formats when writing to a file
by toolic (Bishop) on Jun 06, 2014 at 16:35 UTC
Re: Using multliple formats when writing to a file
by GotToBTru (Prior) on Jun 06, 2014 at 16:41 UTC
    open (REPORT,">$filename") || die "error"; select(REPORT); ... $^ = "NEWPAGE"; ... foreach [outer loop] $~ = "FIRST_FORMAT"; write; foreach [inner loop] $~ = "SECOND_FORMAT"; write; [end inner loop] [end outer loop] close (REPORT) || die ...
    1 Peter 4:10
Re: Using multliple formats when writing to a file
by rlemert (Initiate) on Jun 07, 2014 at 17:58 UTC

    It turns out I am both much smarter than I give myself credit for, and much dumber!

    When I looked at the solutions that were provided here, they included pretty much the things I'd already tried. Further more, when I tried to implement them I had no success - until I looked at the return code in the 'die' statement I added to my write() commands. At that point I suddenly realized that I had my close() statement _inside_ my outer loop!

    Moving this statement to where it should be has cleared up all (I wish) my problems, and all is now right with the world - except for the existence of mornings, a problem for which I see no possible solutions.