[Groningen-pm] Precedence verschil '||' en 'or'

Johan Vromans jvromans at squirrel.nl
Mon Aug 28 05:06:01 PDT 2006


Arnoud Warmerdam <aw at warpnet.nl> writes:

> my ($newsecond) = m|^.*?\[\d+/\w+/\d+:(\d\d:\d\d:\d\d) \+\d+\]| || 
> warn "Cannot parse this line: $_";

De vraag is wat je met dit statement wilt. Je bedoelt (neem ik aan):

    my ($newsecond) = m|^.*?\[\d+/\w+/\d+:(\d\d:\d\d:\d\d) \+\d+\]|
       || warn "...";

maar je zegt nu:

    my ($newsecond) =
       m|^.*?\[\d+/\w+/\d+:(\d\d:\d\d:\d\d) \+\d+\]| || warn "...";

Andersgeschreven:

    my $newsecond;
    if ( m|^.*?\[\d+/\w+/\d+:(\d\d:\d\d:\d\d) \+\d+\]| ) {
       $newsecond = $1;
    }
    else {
       $newsecond = warn "...";
    }

Wat zoveel betekent als:

    else {
       warn "...";
       $newsecond = 1;
    }

Omdat je in dit soort gevallen eigenlijk nooit echt de waarde van de
warn (of die, of print) wilt toekennen is het dus beter om de
lager-prioriteit "or" te gebruiken:

    my ($newsecond) = m|^.*?\[\d+/\w+/\d+:(\d\d:\d\d:\d\d) \+\d+\]|
        or warn "...";

Nu krijgt $newsecond de waarde undefined (die hij al had, maar okee)
als de match faalt.

Groetjes,
        Johan


More information about the Groningen-pm mailing list