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

Every once in a while I have to generate a bunch of similar looking files. Today I created a bunch of ini files, for a hack involving another script, with
use strict; use warnings; my @names = qw(file1 file2); for my $name (@names) { open OUTPUT, "> $name.ini"; print OUTPUT "[main]\n"; print OUTPUT "left_hand_side=$name.html\n"; print OUTPUT "right_hand_side=$name.php\n"; print OUTPUT 'file_regex_pattern=\.php$' . "\n"; print OUTPUT 'dir_regex_pattern=(?!^svn$)'; close OUTPUT; }
Works fine, but I don't like it. I don't like sometimes using " and sometimes ', I don't like all those prints, I just... yuck. Can someone point me towards a better way of solving this type of problem? I know about the template toolkit, and am considering learning that and using it as a solution. Any other ways for quicky throwaway scripts like this?

Replies are listed 'Best First'.
Re: Is there a better way to automate file creation?
by rinceWind (Monsignor) on Sep 14, 2005 at 12:48 UTC

    Consider using a "here document"

    use strict; use warnings; my @names = qw(file1 file2); for my $name (@names) { my $fil; open $fil, '>', "$name.ini"; print $fil <<END [main] left_hand_side=$name.html right_hand_side=$name.php file_regex_pattern=\\.php\$ dir_regex_pattern=(?!^svn\$) END }

    --

    Oh Lord, won’t you burn me a Knoppix CD ?
    My friends all rate Windows, I must disagree.
    Your powers of persuasion will set them all free,
    So oh Lord, won’t you burn me a Knoppix CD ?
    (Missquoting Janis Joplin)

Re: Is there a better way to automate file creation?
by chester (Hermit) on Sep 14, 2005 at 12:49 UTC
    Well there are plenty of modules for writing ini files. Config::IniFiles for example. I don't think Template Toolkit is too good for throwaway scripts. It'd be good if you had to generate the same sort of files all the time. If this is the only time you ever have to generate those ini files, I see nothing wrong with a bunch of prints or heredoc or whatever.
      AppConfig is another pretty powerful config (including ini) file module..
      I don't think Template Toolkit is too good for throwaway scripts.
      If you have it installed and are fast with it, i think it can be very good to use with __DATA__ (you also get the big bonus over here-docs of easy complicated logic) .. I like doing this for quick & dirty .cgi scripts so everything's in one file.. In this case it could be overkill, but it is pretty clear code:
      use strict; use warnings; use Template; my $template = Template->new(); my @names = qw(file1 file2); my $tpl = do{ local $/ = undef; <DATA> }; for my $name (@names) { $template->process($tpl, { name => $name }, "$name.ini"); } __DATA__ [main] left_hand_side=[% name %].html right_hand_side=[% name %].php file_regex_pattern=\.php$ dir_regex_pattern=(?!^svn$)
      note: for a single template, outputting to stdout (e.g. cgi), you can do $template->process(\*DATA, $data ); but in the loop above the filehandle wouldn't be reset in the loop ..
        There's even Inline::TT. It's just syntactic sugar for the above, except that it does on disk caching of the compiled template. That might save some time if the script is used often and the template is large.

        Phil

Re: Is there a better way to automate file creation?
by samizdat (Vicar) on Sep 14, 2005 at 12:49 UTC
    for my $name (@names) { open OUTPUT ">$name.ini" or die "Bad Thing: $!\n"; print OUTPUT <<EOF [main] left_hand_side=$name.html right_hand_side=$name.php file_regex_pattern=\.php$ dir_regex_pattern=(?!^svn$) EOF close OUTPUT; }
    ? See 'here doc' in the Camel, p. 43 in v.2 UPDATE: Closed the loop, sorry.