Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: flag function

by ikegami (Patriarch)
on Jul 11, 2018 at 21:13 UTC ( [id://1218348]=note: print w/replies, xml ) Need Help??


in reply to flag function

The part you're asking about is actually fine. On the other hand, just about everything else looks wrong to me. Let's go over the code.


Always use use strict; use warnings qw( all );!!!


open TEST,"@ARGV[0]";

should be

open(my $TEST, "<", $ARGV[0]) or die("Can't open \"$ARGV[0]\": $!\n");
  • Use the safer three-arg open over the two-arg open.
  • Always check open for errors as it is particularly prone to failure.
  • Don't use global variables for nothing.
  • Don't put variables in quotes for nothing.
  • @ARGV[0] is an array slice, but you want to lookup a single value in the array.

$flag = "ON" ... $flag = "OFF"
should be
my $looking = 1; ... $looking = 0;
  • Your code didn't even compile.
  • Limit the scope of variables to where they are needed.
  • Use true and false values (such as 1 and 0) for booleans instead of two true values (such as "ON" and "OFF").
  • Use meaningful variable names.

while (<TEST>)

should be

while (<>)

<> is short for <ARGV>. ARGV is a specical file handle that reads from the files named in the argument list or STDIN if none.


if (/test/ and $flag eq "ON")

should be

if ($looking && /test/)
  • It's better to only use the low precedence and, or and not for flow control (... or return ..., ... or die ..., ... or next ..., etc).
  • When you want to test for truthness, don't check for a specific value.
  • $looking is far cheaper than /test/, so we'll move it first.

print "start";
should be
print "start\n";
or
say "start";

close TEST;
is useless if you don't check if it succeeded.
So we now have
use strict; use warnings qw( all ); my $looking = 1; while (<>) { if ($looking && /test/) { print "start\n"; $looking = 0; } }

The one problem left is that you read "half" the file for nothing. Let's avoid that!

use strict; use warnings qw( all ); while (<>) { if (/test/) { print "start\n"; last; } }

Replies are listed 'Best First'.
Re^2: flag function
by mr_mischief (Monsignor) on Jul 11, 2018 at 22:15 UTC

    ++ for a clear and thorough explanation but for completeness your last code block omits the declaration and initialization of $looking.

      That wasn't quite the problem, but it's been fixed. Thanks.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1218348]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (2)
As of 2024-04-26 03:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found