@a = @b || @c;              # this is wrong
        @a = scalar(@b) || @c;      # really meant this

"or" doesn't help with this either

        @a = @b or @c;              # this is wrong
        (@a = scalar(@b)) or @c;      # really meant this - @c never is
assigned to @Helen Block <amazingly...@hotmail.com>

the low precedence and/or is was introduced in Perl 5 for this construction

open my $fh '<', $input_filename or die "Could not open $input_filename:
$!";

At $work I see bugs where people are using "or" "and" in expressions, and
the part after the expression never gets into the variable they meant it to.

my $answer = $choice_1 or $choice_2; # this is  wrong it turns into
(my $answer = $choice_1) # or $choice_2

there $choice_2 is only evaluated if the $answer got assigned a false
value, and then it gets evaluated in void context, discarding its value.

Try this in Raku - what does it say? Do you still prefer "or" over "||" ?

my $answer = 0 or 5;

say $answer;


-y


On Fri, Jun 30, 2023 at 10:53 AM Andy Bach <andy_b...@wiwb.uscourts.gov>
wrote:

> I  always took [1]
>  As alternatives to "&&" and "||" when used for control flow, Perl
> provides
>     the "and" and "or" operators (see below). The short-circuit behavior is
>     identical. The precedence of "and" and "or" is much lower, however, so
>     that you can safely use them after a list operator without the need for
>     parentheses
>
> to suggest that and and or are the better ones to use and && or || should
> be used only if they're specifically needed.  Which has always been "never"
> for me.
>
> a
>
> [1]
> perldoc perlop
>    The "||", "//" and "&&" operators return the last value evaluated
> (unlike
>     C's "||" and "&&", which return 0 or 1). Thus, a reasonably portable
> way
>     to find out the home directory might be:
>
>         $home =  $ENV{HOME}
>               // $ENV{LOGDIR}
>               // (getpwuid($<))[7]
>               // die "You're homeless!\n";
>
>     In particular, this means that you shouldn't use this for selecting
>     between two aggregates for assignment:
>
>         @a = @b || @c;              # this is wrong
>         @a = scalar(@b) || @c;      # really meant this
>         @a = @b ? @b : @c;          # this works fine, though
>
>     As alternatives to "&&" and "||" when used for control flow, Perl
> provides
>     the "and" and "or" operators (see below). The short-circuit behavior is
>     identical. The precedence of "and" and "or" is much lower, however, so
>     that you can safely use them after a list operator without the need for
>     parentheses:
>
>         unlink "alpha", "beta", "gamma"
>                 or gripe(), next LINE;
>
>     With the C-style operators that would have been written like this:
>
>         unlink("alpha", "beta", "gamma")
>                 || (gripe(), next LINE);
>
>     It would be even more readable to write that this way:
>
>         unless(unlink("alpha", "beta", "gamma")) {
>             gripe();
>             next LINE;
>         }
>
>     Using "or" for assignment is unlikely to do what you want; see below.
>
> ------------------------------
> *From:* yary <not....@gmail.com>
> *Sent:* Friday, June 30, 2023 8:45 AM
> *To:* Richard Hainsworth <rnhainswo...@gmail.com>
> *Cc:* perl6-users@perl.org <perl6-users@perl.org>
> *Subject:* Re: A question on AND
>
>
> *CAUTION - EXTERNAL: *
> Most of Richard's parting suggestions I understand & agree with, but not
> this: " why are you using '&&' and not 'and' "
>
> My habit (from Perl 5 days) is to use && || for expressions, and reserve
> "and" "or" for "do this if assignment/function call without parens
> succeeds/fails" – is there a refinement on that distinction in Raku which I
> should pay attention to?
>
> -y
>
>
> On Fri, Jun 30, 2023 at 5:40 AM Richard Hainsworth <rnhainswo...@gmail.com>
> wrote:
>
> I tried this and it worked without any problem.
>
> Here's the whole program:
>
> use v6.d;say @*ARGS.raku;if @*ARGS.elems > 0  &&  "@*ARGS[0]".lc eq "debug"  {
>     say 'got'}
> and at the terminal:
>
> $ raku todd-test.raku debug --debug=50
> ["debug", "--debug=50"]
> got
>
>
> FWIW
> why are you quoting ARGS? The .lc coerces to string anyway.
> why are you using && and not 'and'
> why are you not using a sub MAIN with an optional --debug
> eg. sub MAIN( @args, Bool :$debug=False) {
> #stuff
> if $debug { ... }
>
>
>
> On 30/06/2023 06:06, ToddAndMargo via perl6-users wrote:
>
> if @*ARGS.elems > 0  &&  "@*ARGS[0]".lc eq "debug"  {...}
>
> *CAUTION - EXTERNAL EMAIL:* This email originated outside the Judiciary.
> Exercise caution when opening attachments or clicking on links.
>

Reply via email to