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

Hi Perl Monks,

I need to print text to a file. The catch being that some part of the text is static(hardcoded) whereas the rest is dynamic(defined after some processing logic.)

The whole file can be written to sequentially i.e

print static text
print static text
print dynamic text
print static text
print dynamic text
and so on ..

Or the file can be written as

print all static text first
print dynamic text

In the second approach , the dynamic text needs to be inserted into different placeholders between different static text. Is this a better approach ? Can the same file handle be used for this?

Thanks in advance!

Replies are listed 'Best First'.
Re: File dynamic write operations
by moritz (Cardinal) on Aug 13, 2010 at 12:55 UTC
    What's wrong with printing all the text in order?
    print "static text\n"; print 2 + 3, "\n"; # dynamic text print "static text\n";

    Or of course you can use a template, with the static text in a template, and placeholders that can be filled with dynamic data. See for example Text::Template, Template::Alloy.

    Perl 6 - links to (nearly) everything that is Perl 6.
Re: File dynamic write operations
by jethro (Monsignor) on Aug 13, 2010 at 13:04 UTC

    The second approach is possible in a way. The best and most comfortable solution is to use a templating library. For example Text::Template or Template::Toolkit. You write up the static text and include placeholders that the library then substitutes with anything you give it

    What those templating libraries do is no secret. They just put the static text into some array and fill in the placeholders *before* writing it to a file. You can do this yourself if you want, but why reinvent the libraries

    But if you literally want to first store the static data into a file and then overwrite with dynamic text, you just made your live difficult for no reason. Data in a file can't be easily shifted, so either your substitutions have the same length as the placeholders (then you might work with seek to do this) or you have to designate a character as 'ignore' character and put placeholders of maximum length into the file.

Re: File dynamic write operations
by Marshall (Canon) on Aug 15, 2010 at 07:07 UTC
    Is this a better approach ?

    There is no "better or worse" approach here based upon your problem statement. Given that you can do either, I would use the easiest one, which I would guess is method 1? If not then use method 2.

    Now of course how difficult your output format is for the "consumer to consume" is something to be considered. There is not a "one size fits all" answer for this. Sometimes it makes more sense for your program to do more work so that other programs have to do less work and sometimes not!

    Can you put some more "flesh on these bones" so that some application specific recommendation can be made? There is no generic A is better than B for this sort of thing.

      Adding a little more detail.

      I am auto-generating unit test cases which are native to an automation framework. These test cases have static parts(hardcoded) as well as dynamic parts.

      The static parts are the subroutines like init() , uninit(),setup() and cleanup().

      The dynamic parts are the subroutines for the unit test cases themselves.One sub routine is written per feature CLI . These subroutines are identified after processing the product CLI for each feature.

        I think I understand what you are doing. And it appears to me that an output that follows the natural time order of how the various routines are called would be best with an eye towards making each test as independent as possible from the other tests.

        If a test fails, the developer will want to know a) if you can repeat it and then b)given that you can do that, can you repeat it with the smallest data set and number of dependencies possible? Hopefully the printout should be a really good starting place for (b). So if you are asking if it is ok to have "redundant" information in the output? I would say yes!

        If some other person in some other department is running your tests, it is often a very good thing if he winds up with a contiguous set of text that can be snipped out and sent to you when "something goes wrong". So say if you run init(),test1(),init(),test2... Presumably init() does the same thing every time, but by repeating this information in the output, the sequence that caused the problem is all connected in a contiguous way. And I would prefer that over: here's what init() does and then way down in the printout, here's what test1(), test2() did.