in reply to print() on closed filehandle WRITE_FH

In addition to the other helpful postings:

I would really avoid changing the default handle to something else than STDOUT. In other words: Don't do select HANDLE followed by print $text, printf $format,..., say $text. Instead, pass the handle explicitly to the writing function, i.e. print $handle $text, printf $handle $format,..., say $handle $text. (Note: no comma between handle and function arguments.)

The reasons for that are simple:

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Replies are listed 'Best First'.
Re^2: print() on closed filehandle WRITE_FH
by TonyNY (Beadle) on Sep 25, 2018 at 22:36 UTC

    Hi afoken,

    I'm sorry but I am new to perl and not sure how to apply your suggestion.

    Would you happen to have an example handy that you could share?

    Thanks

      Download and save this as demo.pl:

      #!/usr/bin/perl use strict; use warnings; my $fn='lotr.txt'; open my $fh,'>',$fn or die "Could not open $fn: $!"; print "Three Rings for the Elven-kings under the sky,\n"; print $fh "The Road goes ever on and on\n"; print "Seven for the Dwarf-lords in their halls of stone,\n"; print $fh "Down from the door where it began.\n"; print "Nine for Mortal Men doomed to die,\n"; print $fh "Now far ahead the Road has gone,\n"; print "One for the Dark Lord on his dark throne\n"; print $fh "And I must follow, if I can,\n"; print "In the Land of Mordor where the Shadows lie.\n"; print $fh "Pursuing it with eager feet,\n"; print "One Ring to rule them all, One Ring to find them,\n"; print $fh "Until it joins some larger way\n"; print "One Ring to bring them all and in the darkness bind them\n"; print $fh "Where many paths and errands meet.\n"; print "In the Land of Mordor where the Shadows lie.\n"; print $fh "And whither then? I cannot say.\n"; close $fh;

      Then run it:

      X:\>perl demo.pl Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them In the Land of Mordor where the Shadows lie. X:\>type lotr.txt The Road goes ever on and on Down from the door where it began. Now far ahead the Road has gone, And I must follow, if I can, Pursuing it with eager feet, Until it joins some larger way Where many paths and errands meet. And whither then? I cannot say. X:\>
      /tmp>perl demo.pl Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them In the Land of Mordor where the Shadows lie. /tmp>cat lotr.txt The Road goes ever on and on Down from the door where it began. Now far ahead the Road has gone, And I must follow, if I can, Pursuing it with eager feet, Until it joins some larger way Where many paths and errands meet. And whither then? I cannot say. /tmp>

      (Both quotes from The Fellowship of the Ring by J. R. R. Tolkien)

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

        Thanks Alexander for the cool examples, I'm a big LOTR fan BTW.

        However I'm still getting the following error:

        print() on closed filehandle FH at ./get-filldb.pl.iem2 line 42. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 44. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 46. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 48. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 50. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 52. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 54. print() on closed filehandle FH at ./get-filldb.pl.iem2 line 56.

        Basically what I'm trying to do is write to a text file close the file handler then open the file for reading but even If I try to open another text file for reading I get the same error. If I'm closing the file handle after writing shouldn't I be able to open a text file and print the contents? I can open the text file for reading but when I try to print is when I get the error Please see code below

        use strict; use warnings; use HTML::TreeBuilder 3; open(FH, '>', $filename) or die "cannot open file"; select FH; # ... # ... everything you print should be redirected to your file # ... my $root = HTML::TreeBuilder->new; $root->parse_file('file2.html'); my @div_class = $root->find_by_attribute("class","forminput"); foreach my $node (@div_class) { print $node->content_list(); print "\n"; } close FH; my $fn='lotr.txt'; open my $fh,'>',$fn or die "Could not open $fn: $!"; print "Three Rings for the Elven-kings under the sky,\n"; print $fh "The Road goes ever on and on\n"; print "Seven for the Dwarf-lords in their halls of stone,\n"; print $fh "Down from the door where it began.\n"; print "Nine for Mortal Men doomed to die,\n"; print $fh "Now far ahead the Road has gone,\n"; print "One for the Dark Lord on his dark throne\n"; print $fh "And I must follow, if I can,\n"; print "In the Land of Mordor where the Shadows lie.\n"; print $fh "Pursuing it with eager feet,\n"; print "One Ring to rule them all, One Ring to find them,\n"; print $fh "Until it joins some larger way\n"; print "One Ring to bring them all and in the darkness bind them\n"; print $fh "Where many paths and errands meet.\n"; print "In the Land of Mordor where the Shadows lie.\n"; print $fh "And whither then? I cannot say.\n"; close $fh;

        Thanks