비교 연산자 연결

3056 단어 python3rakuperl
다중 비교를 연결하는 구문은 수학에서 매우 일반적이며 $a < $b < $c 와 같은 하나의 표현식으로 다중 변수의 관계가 설명됩니다. It is not commonly seen in programming languages though.

Raku(이전에는 Perl6)는 처음부터 이 구문을 지원합니다. 예제 프로그램 num-within 은 STDIN에서 숫자를 읽고 범위 $from...$until 내에 있는 경우에만 다시 반향하도록 설계되었습니다.

#!/usr/bin/env raku
## Usage: num-within <from> <until>

my ($from, $until) = @*ARGS[0, 1];

for $*IN.lines() -> $num {
    if $from <= $num < $until {
        say $num
    }
}

다음과 같이 사용됩니다.

# bash -c 'while true; do echo $RANDOM; done' | num-within 100 120
114
165
155
130
161
199
108
115
153
166
...

Python3은 비교 연결도 지원합니다. 다음은 python3의 동일한 프로그램입니다.

#!/usr/bin/env python3
## Usage: num-within.py <from> <until>

import sys

num_from  = int(sys.argv[1])
num_until = int(sys.argv[2])

for line in sys.stdin:
    n = int(line)
    if num_from <= n < num_until:
        print(str(n))

최근Perl5 started to partially support comparison chaining since version 5.31.10, 후자 5.32.0. Perl5의 num-within는 다음과 같습니다.

#!/usr/bin/env perl
## Usage: num-within.pl <from> <until>
use v5.31.10;

my ($from, $until) = @ARGV[0,1];

while(defined(my $num = <STDIN>)) {
    if ($from <= $num < $until) {
        print $num;
    }
}

분명히 주어진 변수의 경계를 확인하는 것 외에도 많은 다른 용도가 있습니다. max3(a,b,c)가 좋은 예가 될 것입니다(3개 값 중 최대값 가져오기).

sub max3($x, $y, $z) {
    return $x if $y <= $x >= $z;
    return $y if $z <= $y >= $z;
    return $z;
}

그러나 현재 Perl5에서의 구현은 여전히 ​​덜 이상적입니다. 이 표현을 고려하면:

$a < $b == $c < $d

... Raku, Python3 및 수학에서 다음과 같은 동일한 의미를 표현합니다.

($a < $b) and ($b == $c) and ($c < $d)

반면에 Perl5에서는 현재 논리적으로 다음과 동일합니다.

($a < $b) == ($c < $d)

이 불일치는 Perl5의 == 연산자가 실제로 documented in perlop since perl-5.31.11.인 비교 체인의 일부가 될 수 없기 때문입니다(Arguabaly는 직접 문서화되지 않았지만 우선 순위 테이블에서 파생될 수 있음). 아마도 기다려야 할 것입니다. 조금 더.


本文為 連環比較運算式 一文之英文版.

좋은 웹페이지 즐겨찾기