Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

comment on

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

Hello sar123, and welcome to the Monastery!

By the time the conditional:

if ($_ =~ /^xa1/) {

becomes true in the main while loop, the $fh file pointer has already been moved past the part of the data file you want getsub() to read. You will have to reset it using seek. But be sure to return it to its former position before exiting the subroutine, or you will enter an infinite loop! Best to make it local within getsub, like this (untested):

sub getsub { my $sub = $_[0]; print "sub entered for $sub\n"; local $fh; seek $fh, 0, 0; while (<$fh>) { print if /\.subckt $sub/ .. /\.ends/; } }

Update 1: Turns out that local doesn’t work the way I hoped it would. :-( This works:

use strict; use warnings; open(my $fh, '<', $ARGV[0]) or die "Could not open file: $!"; sub getsub { my $sub = $_[0]; print "sub entered for $sub\n"; open my $fh2, '<', 'subs.txt' or die "Could not open file: $!"; while (<$fh2>) { print if /\.subckt $sub/ .. /\.ends/; } close $fh2 or die "Could not close file: $!"; } while (my $line = <$fh>) { if ($line =~ /^xa1/) { print "line found to be $line\n"; while ((my $nxt = readline($fh)) =~ /^\+/) { $line = $nxt; print "line changed to $line\n"; } $line =~ s/\s+$//; print "last line is $line\n"; my $sub = (split '\s', $line)[-1]; print "subcircuit found is $sub in $line\n"; my $file_pos = tell $fh; getsub($sub); seek $fh, $file_pos, 0; } } close $fh or die "Could not close file: $!";

Output:

2:55 >perl 1032_SoPW.pl subs.txt line found to be xa1 a s f a1 last line is xa1 a s f a1 subcircuit found is a1 in xa1 a s f a1 sub entered for a1 .subckt a1 x y z xa a b c1 xb c d e1 xc f g h1 .ends 2:56 >

Update 2: To eliminate the warning that arises when the line beginning xa1 is the last line in the data file, change:

while ((my $nxt = readline($fh)) =~ /^\+/)

to:

while (!eof && (my $nxt = readline($fh)) =~ /^\+/)

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,


In reply to Re: Variable not set properly in perl by Athanasius
in thread Variable not set properly in perl by sar123

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 making s'mores by the fire in the courtyard of the Monastery: (3)
As of 2024-04-24 02:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found