Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??

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":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (5)
As of 2024-04-19 02:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found