Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^2: Text Analysis: given(){when(){}} block throws a 'useless use of private variable...etc' error

by biohisham (Priest)
on Oct 18, 2010 at 17:15 UTC ( [id://865993]=note: print w/replies, xml ) Need Help??


in reply to Re: Text Analysis: given(){when(){}} block throws a 'useless use of private variable...etc' error
in thread Text Analysis: given(){when(){}} block throws a 'useless use of private variable...etc' error

You provided some very interesting clues to inspire me
I'm quessing $_ is the private variable which is not used.
If given takes a single variable or value and yet quite interesting still, it actually works with two values, even with three values as I tried it in the following demo, that means it is a very strong function that we probably need to develop more for us to avail of its full capacity in Perl 5.

Thinking about if we can have an embedded given(){when(){}} to make it accept two arguments is out of the question since that may lead to a labyrinth of brain-damaging curlies but maybe just keeping track of the arguments passed to given in @_ may provide a path to beat if that can be possible...

use strict; use warnings; use feature qw(switch); my $foo = 'foo'; my $bar = 'bar'; my $baz = 'baz'; given($foo, $bar, $baz){ when($foo eq 'check' and $bar eq 'treck'){print "nei +ther is standard\n";} when($foo eq 'foo' and $bar eq 'treck'){print "$foo +is standard\n";} when($foo eq 'check' and $bar eq 'bar'){print "$bar +is standard\n";} when($foo eq 'foo' and $bar eq 'bar' and $baz eq 'ba +z'){print "All are standard\n";} when($foo eq 'foo' and $bar eq 'bar'){print "both ar +e standard\n";} }
Notice that the last 2 when blocks are both true however, the first one in order which evaluates to true is the one that gets its print statement executed and the second one is totally ignored, perambulation of the when blocks can testify to that...

The reason I used a switch statement is because I wanted to clean up my code from the if else pollution in a quick way and the switch is a very neat way to do so, also, the values assigned to '' are going to be needed in another extension to the original code ergo the $var ||= '' statement.

Checking perlsyn for clues..


Excellence is an Endeavor of Persistence. A Year-Old Monk :D .
  • Comment on Re^2: Text Analysis: given(){when(){}} block throws a 'useless use of private variable...etc' error
  • Select or Download Code

Replies are listed 'Best First'.
Re^3: Text Analysis: given(){when(){}} block throws a 'useless use of private variable...etc' error
by TomDLux (Vicar) on Oct 18, 2010 at 19:05 UTC

    In my opinion, you're abusing the "given/when" construct. Yes, it works, because you have a boolean expression in the when() clauses. But you could put anything in the given part, and it would work just the same.

    The point of "given/when", is that the value in the given clause is assigned to $_, and then you can use invisible default $_ in all the when() tests. From "perldoc perlsyn":

    given($_) { when (/^abc/) { $abc = 1; } when (/^def/) { $def = 1; } when (/^xyz/) { $xyz = 1; } default { $nothing = 1; } } # and similarly given($foo) { when (undef) { say '$foo is undefined'; } when ("foo") { say '$foo is the string "foo"'; } when ([1,3,5,7,9]) { say '$foo is an odd digit'; continue; # Fall through } when ($_ < 100) { say '$foo is numerically less than 100'; } when (\&complicated_check) { say 'a complicated check for $foo is true'; } default { die q(I don't know what to do with $foo); } }

    As far as I can see, you're using a given/when block to produce an if/elsif block with an extra level of indentation.

    If you modify your foo/bar/baz example so that each print block has a new statement after it: pritn "\$_ is $_.\n";. That will print out what the value of $_ is, no matter which path you take. You will see that $_ is 'baz'. Your ($foo, $bar, $baz) evaluates the sequence of expressions and uses the last one as the chosen value. The earlier ones are evaluated only for their side-effect. Of course, $foo does not have a side-effect, but it could equally be $foo++, or $foo->(). That's why you're getting the message about "useless use of a private variable", because only the last one gets assigned to $_.

    As Occam said: Entia non sunt multiplicanda praeter necessitatem.

Log In?
Username:
Password:

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

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

    No recent polls found