Thank you for providing enough code to reproduce your issue!

The problem is that because you're not using strict "refs" (Update: and strict "subs"), there is some funky symbolic reference stuff going on here. It's unclear to me why you even need to pass the parameter LF in &mystart($LumberFile,LF);, but AFAICT what is going on here is that that call is actually being interpreted as &mystart($LumberFile,"LF");, and then inside VRML.pm there is no filehandle named LF because that was opened in the main package.

The best thing to do is to rewrite your code so that it works under strict and warnings. The minimum changes I would recommend is to change the definition and call of mystart as follows:

mystart($LumberFile); sub mystart { my ($file) = @_; open( my $fh, "> $file" ) or die ...

If you need the $fh parameter to mystart, you need to show us more context as to how it gets used for us to make a recommendation for a useful replacement (Update: Re^3: Filehandle in subroutine in use VRML.pm).

However, I see several other older code styles in your sample code, for example using the -w shebang switch (What's wrong with -w and $^W), using the old ampersand-style sub calls (perlsub), and the two-argument open ("open" Best Practices). So here's your sample code updated to modern Perl, I strongly suggest you adopt this style for all your code:

#!/usr/bin/perl use warnings; use strict; use VRML; my $Dir = "vrmlstuff"; my $Subdir = "DrillPressTable"; my $LumberFile = "$Dir/$Subdir/lumber.wrl"; mystart($LumberFile); sub mystart { my ($file) = @_; open my $fh, '>', $file or die "ERROR: Unable to open $file for output"; my @lines = split /\n/, <<END; #VRML V2.0 utf8 NavigationInfo { headlight TRUE } DirectionalLight { # First child direction 0 0 -1 # Light illuminating the scene } END my $i = 0; if ( $i == 0 ) { for my $line (@lines) { print $fh "$line\n"; } } elsif ( $i == 1 ) { myprint( \@lines, $fh ); } elsif ( $i == 2 ) { printout( \@lines, $fh ); } } sub myprint { my ($lines, $fh) = @_; for my $line ( @{$lines} ) { print $fh "$line\n"; } }

VRML.pm:

#!/usr/bin/perl package VRML; use warnings; use strict; use Exporter 'import'; our @EXPORT = qw/printout/; sub printout { my ($lines, $fh) = @_; $fh = *STDOUT unless $fh; for my $line ( @{$lines} ) { print $fh "$line\n"; } } 1;

In reply to Re: Filehandle in subroutine in use VRML.pm by haukex
in thread Filehandle in subroutine in use VRML.pm by smittypaddler

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.