كيف يمكنني تقييم التعبيرات بالسلاسل من سلسلة، في بيرل؟

StackOverflow https://stackoverflow.com/questions/1824460

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا لست متأكدا ماذا نطلق على هذه النوع من التعابير، لذلك مثال سيكون أسهل ...

هل هناك طريقة في بيرل لتقييم تعبيرات مثل a < b <= c؟ لدي ملف التكوين الذي يسمح للمستخدم لتوفير التعابير الشرطية لإجراءات معينة. بدلا من تقسيم حالة إلى قسمين (كما أود أن تفعل عادة في التعليمات البرمجية)، أود أن تمثيلها بهذه الطريقة، إذا كان ذلك ممكنا.

هل كانت مفيدة؟

المحلول

وهذا يأتي في بيرل 6، بالتأكيد. ولكن للأسف، وأنا لا أعتقد انها واحدة من الأشياء من بيرل 6 استدانه بيرل 5.10.

نصائح أخرى

وهذا هو أقل قليلا للقراءة، ولكن تنجز ما تريد: a < b && b <= c

وكما ذكر آخرون Perl5 لا (حتى الآن) قد بالسلاسل المقارنات.

ولكن إذا كنت تحليل "ل<ب <= ج" من ملف التكوين وأريد فقط لتقييمها ثم ربما هذا ربما ما التوجيه الخاص بك بعد؟

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" }
    }
}

ولها فقط مثال بدائية (أي لم يكتمل ولا تدقيق الأخطاء)، ولكن أعتقد أن تحصل على هذه الفكرة.

وقد تجد شيئا من هذا القبيل بالفعل على CPAN . شيء من هذا القبيل Parse::RPN ربما لبنة مفيدة.

والآن إذا كنت السؤال هو حول كيفية تحليل حرفيا a < b <= c ثم وهذا هو آخر غلاية من الأسماك!

و/ I3az /

وتجاهل أي التحقق من صحة المدخلات أو تنفيذ مقارنة في نهاية المطاف لحظة، ويجب أن يكون رمز التالي (أو الاختلاف البسيط منه) قادرا على كتابة هذا البيان:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top