Frage

Ich bin nicht wirklich sicher, was diese Art von Ausdrücken zu nennen, so wäre ein Beispiel einfacher sein ...

Gibt es eine Möglichkeit in Perl zu Ausdrücken wie a < b <= c zu bewerten? Ich habe eine Konfigurationsdatei, die der Benutzer bedingte Ausdrücke für bestimmte Aktionen bereitstellen kann. Anstatt den Zustand in zwei Teile aufzuteilen (wie ich normalerweise in Code tun würde), ich mag es auf diese Art und Weise darzustellen, wenn möglich.

War es hilfreich?

Lösung

Das ist, kommt in Perl 6, sicher. Aber leider, ich glaube nicht, es ist eines der Dinge, von Perl 6 entlehnt von Perl 5.10.

Andere Tipps

Chained Vergleiche in Perl 6 gezeigt werden.

Nun würde es möglich sein, eine Kaskadierung Unterroutine für Perl 5.x zu schaffen? Das ist eine interessante Frage ...

Dies ist etwas weniger lesbar, aber erreicht, was Sie wollen: a < b && b <= c

Wie andere erwähnt haben Perl5 hat (noch) nicht haben gekettet Vergleiche.

Wenn Sie jedoch aus einer Konfigurationsdatei „a

use strict;
use warnings;
use 5.010;

my ($a, $b, $c) = (10, 20, 30);

say 'Its true!'  if comparison( $a, '<', $b, '<=', $c );

sub comparison {
    my $left = shift;

    while (my $cmp = shift) {
        my $right = shift;
        compare( $cmp, $left, $right ) or return;
        $left = $right;
    }

    return 1;
}

sub compare {
    my $op = shift;
    given ($op) {
        when ( '<'  ) { return $_[0] <  $_[1] }
        when ( '<=' ) { return $_[0] <= $_[1] }
        default       { die "Invalid comparison operator" }
    }
}

Es ist nur ein rudimentäres Beispiel (dh. Nicht vollständig und keine Fehlerprüfung), aber ich denke, Sie bekommen die Idee.

Und Sie können so etwas wie dieses finden bereits auf CPAN . So etwas wie Parse::RPN vielleicht ein nützlicher Baustein.

Wenn Sie nun die Frage ist, wie dann buchstäblich zu analysieren a < b <= c das ist ein anderer Kessel der Fische!

/ I3az /

jede Eingabevalidierung oder Ausführung des eventuellen Vergleichs für den Moment ignoriert, der folgende Code (oder eine geringfügige Änderung davon) sollte Ihre Aussage neu zu schreiben fähig sein:

sub rewrite {
    my $str = shift;
    my $ops = join "|" => qw/ < > <= >= == != /;
    1 while $str =~ s/ ($ops) \s* (\w+?) \s* ($ops) /$1 $2 && $2 $3/xg;
    $str
}

print rewrite "a < b < 5 < c != d";
# prints a < b && b < 5 && 5 < c && c != d
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top