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

Here's a snippet of code to output data to a file:
my $household; my $voter_rating; my $support_level; my $phone_number; my $last_name; my $first_name; format Household = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $household ================================== . format Voter = @<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<< @<< @<<<<<<<<<<<< $last_name, $first_name, $voter_rating, $phone_number . open (Household, '>out.txt'); foreach (sort keys %households) { $household = $_; write Household; foreach ($households{$household}) { my @members = @{$_}; foreach (@members) { my %member = %{$_}; $first_name = $member{first_name}; $last_name = $member{last_name}; $voter_rating = $member{voter_rating}; $support_level = $member{support_level}; if ($member{mobile_number}) { $phone_number = $member{mobile_number}; } else { $phone_number = $member{phone_number}; } if (!$phone_number) { $phone_number = ''; } write Voter; } } }
I'm getting an error:
write() on unopened filehandle Voter at ./velis_munger.pl line 298
The output of the file is what I want but I have no idea why I'm getting this error. How do I get rid of it?

 

UPDATE: SOLUTION ==============
open (MYFILE, '>out.txt'); select(MYFILE); foreach (sort keys %households) { $household = $_; $~ = 'Household'; write; foreach ($households{$household}) { my @members = @{$_}; foreach (@members) { my %member = %{$_}; $first_name = $member{first_name}; $last_name = $member{last_name}; $voter_rating = $member{voter_rating}; $support_level = $member{support_level}; if ($member{mobile_number}) { $phone_number = $member{mobile_number}; } else { $phone_number = $member{phone_number}; } if (!$phone_number) { $phone_number = ''; } $~ = 'Voter'; write; } } }

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon";
$nysus = $PM . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re: How to print two different formats to same file without getting an error?
by MidLifeXis (Monsignor) on Feb 05, 2014 at 18:32 UTC

    It looks like the format, select, and write command documentation may have something to say about it. You would (untested) need to set the current output handle with select, set the format with $~ (and others - see select), and then write to the filehandle. See also Format Variables for an example of how to set the formats in a (mostly) unintended side-effect free way.

    --MidLifeXis

Re: How to print two different formats to same file without getting an error?
by toolic (Bishop) on Feb 05, 2014 at 17:20 UTC
      I found the solution. Modified OP with solution.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon";
      $nysus = $PM . $MCF;
      Click here if you love Perl Monks

        I can't test this refactored version of your script because, as toolic pointed out earlier, it's not a complete computer program.

        use strict; use warnings; use autodie qw( open close ); use English qw( -no_match_vars ); my %households; my $household; my $first_name; my $last_name; my $voter_rating; my $support_level; my $phone_number; format Household = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $household ================================== . format Voter = @<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<< @<< @<<<<<<<<<<<< $last_name, $first_name, $voter_rating, $phone_number . open my $fh, '>encoding(ISO-8859-1)', 'out.txt'; select $fh; for $household (sort keys %households) { local $FORMAT_NAME = 'Household'; write; for my $member (@{ $households{$household} }) { $first_name = $member->{first_name}; $last_name = $member->{last_name}; $voter_rating = $member->{voter_rating}; $support_level = $member->{support_level}; $phone_number = $member->{mobile_number} // $member->{phone_n +umber} // ''; local $FORMAT_NAME = 'Voter'; write; } } close $fh; exit 0;

        Jim

      I tried select before but either I'm using it wrong or it's not the solution. What I'm confused by is that the file handle is the same as the format.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon";
      $nysus = $PM . $MCF;
      Click here if you love Perl Monks