John M. Dlugosz has asked for the wisdom of the Perl Monks concerning the following question:

In the ten years I've been using Perl, I've never used Perl formats. Maybe this is my last chance before they are moved out of the core?

Here is my situation.

sub listing_out # override this for your desired output format { my ($self, $output, $starting, $count, $file, $line, $text)= @_; # I guess I really should learn something about the old formatting st +uff! print {$output} "[$starting] "; foreach my $i (0..$count) { print {$output} " $self->{PROGRAM}[$starting+$i]"; } print {$output} "\t$text\n"; }
I have three columns of output in what's essentially an assembler listing, showing the address, the codes generated starting at that address, and the original source code text.

The middle column can be of varing length, depending on how much was on that source line and of what complexity. But I want the text listing to line up with itself, starting at some fixed column.

If the middle column is longer than planned, wrap it onto multiple lines.

So, this sounds like a job for format I thought!

I start reading about write and it mentions the current format attached to the file handle but that it can be selected. I then turn to perlform and the first thing it says is that format takes a NAME.

Well, I immediatly see a mismatch between this classic stuff and modern programming. My function takes a parameter for an output handle, and it might not even be a named HANDLE thing.

Is perl formats the way to go here, or should I just leave it in the past? What should I use?

—John

Replies are listed 'Best First'.
Re: To format or not?
by hossman (Prior) on Feb 16, 2004 at 09:03 UTC

    You can still use formats even without named file handles.

    The 'name' refered to when talking about formats is the name of the format itself -- you can declare a format (or a pair of formats since they're designed to have a seperate 'top' format for the beginings of pages) and then associate that format to any filehandle you 'select'

    This should help get you started...

    #!/usr/bin/perl use warnings; use strict; sub doWrite { my ($fh, $label, $count, $text) = @_; format DO_WRITE_FORMAT = @<<<<< @>>>> ^<<<<<<<<<<<<<<<<<<<<<<<<<<< $label,$count,$text ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<< $text . select((select($fh), $~ = "DO_WRITE_FORMAT" )[0]); write $fh; } doWrite(\*STDOUT, "L1", 4567, "the quick brown fox jumped over the lazy fatass dog."); doWrite(\*STDERR, "L222", 12, "the large bulky dog ate the snippetty hyperactive fox.");
      This should help get you started...

      Yes, thanks a lot.

      So, are the parameter lines remembered as text and evaluated at the point write is called, or does it form a closure where the format is defined?

        So, are the parameter lines remembered as text and evaluated at the point write is called, or does it form a closure where the format is defined?

        Eh... now we're getting into a grey error that I'm not really sure of. I think the variables in the format need to be declared prior to declaring the format, but they get evaluated each time write is called. I'm not sure if that's done using dynamic scoping or not.

        In your use case, declaring the format inside your method is probably the cleanest thing to do.