Artikel

1.2: Zahlenvergleiche mit < ,> und = - Mathematik


1.2: Zahlenvergleiche mit < ,> und = - Mathematik

Sollte ich == oder eq wählen, um Strings in EL zu vergleichen?

== und eq geben das gleiche Ergebnis mit EL, um meine String-Vergleichstests durchzuführen:

Soll ich stattdessen eq verwenden? Ist == nur für ganze Zahlen? Aber es funktioniert auch für Saiten. AFAIK == testet, ob hashCodes gleich sind und eq bedeutet "sinnvoll verschieden".

Eine andere Frage sagt == und eq tun dasselbe.

Gibt es hier keinen Unterschied? IST nicht der Unterschied, den ich behaupte: == schaut sich den HashCode an und eq schaut sich die Implementierung von equals(. ) an.


Erstens: Bitte verwenden Sie immer Warnungen. Sie hätten sofort folgendes erkannt:

Perl v5.9.0 wurde mit der Version verteilt. Und dieses Modul macht es sehr einfach, Versionsnummern zu vergleichen:

Ein String-Vergleich funktioniert nur, wenn jede Zahl zwischen den Punkten die gleiche Länge hat. Ein Stringvergleich hat keine Kenntnis von Nummer und fängt an, Punkte und Ziffern zu vergleichen (da beides Zeichen in einer Zeichenfolge sind).

Es gibt ein CPAN-Modul, das genau das tut, was Sie suchen: Sortieren::Versionen

Wenn Sie Strings mit numerischen Relationsoperatoren < , > usw. vergleichen, gibt Perl eine Warnung aus, wenn Sie warnings verwenden. Perl wird jedoch weiterhin versuchen, die Strings in Zahlen umzuwandeln. Wenn der String mit Ziffern beginnt, verwendet Perl diese, ansonsten entspricht der String 0. In Ihrem Beispiel hat der Vergleich von '1.4.5' und '8.7.8' denselben Effekt wie der Vergleich der Zahlen 1.4 und 8.7.

Aber für ne , gt usw. spielt es keine Rolle, ob Ihre Strings aus Zahlen oder etwas anderem (einschließlich Punkten) bestehen. Deshalb:

Daher können Sie weder > , < , etc. noch gt , lt , etc. für den Versionsvergleich verwenden, Sie müssen einen anderen Ansatz wählen, wie er beispielsweise in anderen Antworten vorgeschlagen wird.

Ich bin mir nicht sicher, was dies kostet, aber Sie könnten es mit Sort::Naturally versuchen. Und insbesondere der ncmp-Operator.

Wie @tent betonte, ist die Lösung von @SebastianStumpf nahe, aber nicht ganz richtig, weil:

Glücklicherweise lässt sich dies leicht lösen, indem man den Hinweis in der Dokumentation der Version befolgt:

Das führende 'v' wird jetzt aus Gründen der Übersichtlichkeit dringend empfohlen und wird in einer zukünftigen Version eine Warnung ausgeben, wenn es weggelassen wird.


1.2: Zahlenvergleiche mit < ,> und = - Mathematik

Ein SAS-Operator ist ein Symbol, das einen Vergleich, eine arithmetische Berechnung oder eine logische Operation, eine SAS-Funktion oder gruppierende Klammern darstellt. SAS verwendet zwei Haupttypen von Operatoren:

Ein Präfixoperator ist ein Operator, der auf die Variablen, Konstanten, Funktionen oder Klammerausdrücke angewendet wird, die unmittelbar darauf folgen. Als Präfixoperatoren können das Pluszeichen (+) und das Minuszeichen (-) verwendet werden. Das Wort NOT und seine entsprechenden Symbole sind ebenfalls Präfixoperatoren. Im Folgenden finden Sie Beispiele für Präfixoperatoren, die mit Variablen, Konstanten, Funktionen und Klammerausdrücken verwendet werden:

Ein Infix-Operator gilt für die Operanden auf jeder Seite davon, zum Beispiel 6<8. Infixoperatoren umfassen Folgendes:

SAS bietet auch mehrere andere Operatoren, die nur mit bestimmten SAS-Anweisungen verwendet werden. Die WHERE-Anweisung verwendet eine spezielle Gruppe von SAS-Operatoren, die nur gültig ist, wenn sie mit WHERE-Ausdrücken verwendet wird. Eine Erläuterung dieser Operatoren finden Sie unter WHERE-Ausdrucksverarbeitung. Der Operator _NEW_ wird verwendet, um eine Instanz eines DATA-Schrittkomponentenobjekts zu erstellen. Weitere Informationen finden Sie unter Verwenden von DATA-Schrittkomponentenobjekten.

Arithmetische Operatoren zeigen an, dass eine arithmetische Berechnung durchgeführt wird, wie in der folgenden Tabelle gezeigt:

Rechenzeichen
Symbol Definition Beispiel Ergebnis
** Potenzierung erhöhe A zur dritten Potenz
* Multiplikation (Tabellenanmerkung 1) multipliziere 2 mit dem Wert von Y
/ Einteilung dividiere den Wert von VAR durch 5
+ Zusatz addiere 3 zum Wert von NUM
- Subtraktion subtrahiere den Wert von DISCOUNT vom Wert von SALE

TABELLE ANMERKUNG 1: Das Sternchen (*) ist immer erforderlich, um anzuzeigen, dass die Multiplikation 2Y und 2(Y) keine gültigen Ausdrücke sind.

Wenn ein fehlender Wert ein Operand für einen arithmetischen Operator ist, ist das Ergebnis ein fehlender Wert. Unter Fehlende Werte finden Sie eine Erläuterung, wie Sie die Weitergabe fehlender Werte verhindern können.

Die Reihenfolge, in der SAS diese Operatoren auswertet, finden Sie unter Auswertungsreihenfolge in zusammengesetzten Ausdrücken.

Vergleichsoperatoren richten einen Vergleich, eine Operation oder eine Berechnung mit zwei Variablen, Konstanten oder Ausdrücken ein. Wenn der Vergleich wahr ist, ist das Ergebnis 1. Wenn der Vergleich falsch ist, ist das Ergebnis 0.

Vergleichsoperatoren können als Symbole oder mit ihren mnemonischen Äquivalenten ausgedrückt werden, die in der folgenden Tabelle aufgeführt sind:

Vergleichsoperatoren

=

Symbol Mnemonisches Äquivalent Definition Beispiel
= EQ gleicht
^= NE ungleich (Tabellenanmerkung 1)
¬= NE Nicht gleichzusetzen mit
NE Nicht gleichzusetzen mit
> GT größer als
< LT weniger als
>= GE größer oder gleich (Tabellenanmerkung 2)
<= LE kleiner oder gleich (Tabellenanmerkung 3)

IM gleich einem aus einer Liste

TABELLE ANMERKUNG 1: Das Symbol, das Sie für NE verwenden, hängt von Ihrem PC ab.

TABELLE ANMERKUNG 2: Das Symbol => wird auch aus Kompatibilitätsgründen mit früheren Versionen von SAS akzeptiert. Sie wird in WHERE-Klauseln oder in PROC SQL nicht unterstützt.

TABELLE ANMERKUNG 3: Das Symbol =< wird auch aus Kompatibilitätsgründen mit früheren Versionen von SAS akzeptiert. Sie wird in WHERE-Klauseln oder in PROC SQL nicht unterstützt.

Die Reihenfolge, in der SAS diese Operatoren auswertet, finden Sie unter Auswertungsreihenfolge in zusammengesetzten Ausdrücken.

Hinweis: Sie können jedem Operator einen Doppelpunkt-Modifikator (:) hinzufügen, um nur ein bestimmtes Präfix einer Zeichenfolge zu vergleichen. Weitere Informationen finden Sie unter Zeichenvergleiche.

Hinweis: Sie können den IN-Operator verwenden, um einen Wert, der von einem Ausdruck auf der linken Seite des Operators erzeugt wird, mit einer Werteliste auf der rechten Seite zu vergleichen. Die Form des Vergleichs ist:

Die Komponenten des Vergleichs sind wie folgt:

kann ein beliebiger gültiger SAS-Ausdruck sein, ist aber normalerweise ein Variablenname, wenn er mit dem IN-Operator verwendet wird.

Beispiele für die Verwendung des IN-Operators finden Sie unter Der IN-Operator in numerischen Vergleichen.

Numerische Vergleiche

SAS führt numerische Vergleiche durch, die auf Werten basieren. Wenn im Ausdruck A<=B A den Wert 4 und B den Wert 3 hat, dann hat A<=B den Wert 0 oder false. Wenn A 5 und B 9 ist, hat der Ausdruck den Wert 1 oder wahr. Wenn A und B jeweils den Wert 47 haben, dann ist der Ausdruck wahr und hat den Wert 1.

Vergleichsoperatoren kommen häufig in IF-THEN-Anweisungen vor, wie in diesem Beispiel:

Sie können Vergleiche auch in Ausdrücken in Zuweisungsanweisungen verwenden. Die vorhergehenden Anweisungen können beispielsweise wie folgt umkodiert werden:

Da SAS Mengen in Klammern auswertet, bevor irgendwelche Operationen ausgeführt werden, werden die Ausdrücke (x<y) und (x>=y) zuerst ausgewertet und das Ergebnis (1 oder 0) wird durch die Ausdrücke in Klammern ersetzt. Wenn X=6 und Y=8 ist, wird der Ausdruck daher wie folgt ausgewertet:

Das Ergebnis dieser Anweisung ist C=5.

Wenn Sie numerische Werte unterschiedlicher Länge vergleichen, erhalten Sie möglicherweise ein falsches Ergebnis, da Werte mit weniger als 8 Byte eine geringere Genauigkeit aufweisen als solche mit mehr als 8 Byte. Das Runden wirkt sich auch auf das Ergebnis numerischer Vergleiche aus. Eine vollständige Erläuterung der numerischen Genauigkeit finden Sie unter SAS-Variablen.

Ein fehlender numerischer Wert ist kleiner als jeder andere numerische Wert, und fehlende numerische Werte haben ihre eigene Sortierreihenfolge. Weitere Informationen finden Sie unter Fehlende Werte.

Sie können eine Kurzschreibweise verwenden, um einen Bereich sequenzieller Ganzzahlen anzugeben, die durchsucht werden sollen. Der Bereich wird mit der Syntax M:N als Wert in der zu durchsuchenden Liste angegeben, wobei M die Untergrenze und N die Obergrenze ist. M und N müssen ganze Zahlen sein, und M, N und alle ganzen Zahlen zwischen M und N sind im Bereich enthalten. Die folgenden Anweisungen sind beispielsweise äquivalent.

y = x in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Sie können mehrere Bereiche in derselben IN-Liste verwenden, und Sie können Bereiche mit anderen Konstanten in einer IN-Liste verwenden. Das folgende Beispiel zeigt einen Bereich, der mit anderen Konstanten verwendet wird, um zu testen, ob X 0, 1, 2, 3, 4, 5 oder 9 ist.

Sie können auch den IN-Operator verwenden, um ein Array mit numerischen Werten zu durchsuchen. Der folgende Code erstellt beispielsweise ein Array a , definiert eine Konstante x und verwendet dann den IN-Operator, um nach x in Array a zu suchen Beachten Sie, dass die Array-Initialisierungssyntax von Array a <10>(2*1:5) an . erstellt Array, das die Anfangswerte von 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 enthält.

Hinweis: PROC SQL unterstützt diese Syntax nicht.

Sie können Vergleiche mit Zeichenoperanden durchführen, aber der Vergleich liefert immer ein numerisches Ergebnis (1 oder 0). Zeichenoperanden werden Zeichen für Zeichen von links nach rechts verglichen. Die Zeichenreihenfolge hängt von der Sortierfolge ab, normalerweise ASCII oder EBCDIC, die von Ihrem Computer verwendet wird.

In den Sortierfolgen EBCDIC und ASCII ist beispielsweise G größer als A, daher ist dieser Ausdruck wahr:

Zwei Zeichenwerte ungleicher Länge werden verglichen, als ob am Ende des kürzeren Wertes vor dem Vergleich Leerzeichen angehängt würden. Ein leerer oder fehlender Zeichenwert ist kleiner als jeder andere druckbare Zeichenwert. Zum Beispiel, weil. kleiner als h ist, ist dieser Ausdruck wahr:

Da abschließende Leerzeichen bei einem Vergleich ignoriert werden, ist 'fox ' äquivalent zu 'fox' . Da jedoch Leerzeichen am Anfang und in der Mitte eines Zeichenwerts für SAS von Bedeutung sind, ist 'fox' nicht gleichbedeutend mit 'fox'.

Sie können nur ein angegebenes Präfix eines Zeichenausdrucks vergleichen, indem Sie einen Doppelpunkt (:) nach dem Vergleichsoperator verwenden. SAS schneidet den längeren Wert während des Vergleichs auf die Länge des kürzeren Werts ab. Im folgenden Beispiel weist der Doppelpunkt-Modifizierer nach dem Gleichheitszeichen SAS an, nur das erste Zeichen der Werte der Variablen NACHNAME zu betrachten und die Beobachtungen auszuwählen, deren Namen mit dem Buchstaben S beginnen:

Da druckbare Zeichen größer als Leerzeichen sind, wählen die beiden folgenden Anweisungen Beobachtungen mit Werten von LASTNAME aus, die größer oder gleich dem Buchstaben S sind:

Hinweis: Wenn Sie einen Zeichenwert der Länge Null mit einem anderen Zeichenwert in einem IN:-Vergleich oder einem EQ:-Vergleich vergleichen, werden die beiden Zeichenwerte nicht als gleich betrachtet. Das Ergebnis wird immer zu 0 oder falsch ausgewertet.

Die in diesem Abschnitt behandelten Operationen zeigen Ihnen, wie Sie ganze Zeichenketten und die Anfänge von Zeichenketten vergleichen. Mehrere SAS-Zeichenfunktionen ermöglichen es Ihnen, innerhalb von Zeichenfolgen nach Werten zu suchen und diese zu extrahieren. Vollständige Beschreibungen aller SAS-Funktionen finden Sie unter SAS-Sprachreferenz: Wörterbuch.

Sie können den IN-Operator mit Zeichenfolgen verwenden, um zu bestimmen, ob der Wert einer Variablen in einer Liste von Zeichenwerten enthalten ist. Die folgenden Aussagen führen zu den gleichen Ergebnissen:

wenn Bundesland in ('NY','NJ','PA') dann Region+1

if state='NY' or state='NJ' or state='PA' then region+1

Sie können auch den IN-Operator verwenden, um ein Array von Zeichenwerten zu durchsuchen. Der folgende Code erstellt beispielsweise ein Array a , definiert eine Konstante x und verwendet dann den IN-Operator, um nach x in Array a zu suchen.

Logische Operatoren, auch Boolesche Operatoren genannt, werden normalerweise in Ausdrücken verwendet, um Vergleichssequenzen zu verknüpfen. Die logischen Operatoren sind in der folgenden Tabelle aufgeführt:

Logische Operatoren

TABELLE ANMERKUNG 1: Das Symbol, das Sie für ODER verwenden, hängt von Ihrer Betriebsumgebung ab.

TABELLE HINWEIS 2: Das Symbol, das Sie für NOT verwenden, hängt von Ihrer Betriebsumgebung ab.

Die Reihenfolge, in der SAS diese Operatoren auswertet, finden Sie unter Auswertungsreihenfolge in zusammengesetzten Ausdrücken.

Außerdem kann ein numerischer Ausdruck ohne logische Operatoren als boolescher Ausdruck dienen. Ein Beispiel für boolesche numerische Ausdrücke finden Sie unter Boolesche numerische Ausdrücke.

Sind beide mit UND verknüpften Größen 1 (wahr), dann ist das Ergebnis der UND-Verknüpfung 1, ansonsten ist das Ergebnis 0. Zum Beispiel im folgenden Vergleich:

das Ergebnis ist nur wahr (hat einen Wert von 1), wenn sowohl A<B als auch C>0 1 (wahr) sind, dh wenn A kleiner als B ist und C positiv ist.

Zwei Vergleiche mit einer gemeinsamen Variablen, die durch UND verknüpft sind, können mit einem implizierten UND verdichtet werden. Die folgenden zwei IF-Anweisungen für Untergruppen führen beispielsweise zum gleichen Ergebnis:

Wenn eine der durch ODER verknüpften Größen 1 (wahr) ist, dann ist das Ergebnis der ODER-Operation 1 (wahr), andernfalls erzeugt die ODER-Operation eine 0. Betrachten Sie beispielsweise den folgenden Vergleich:

Das Ergebnis ist wahr (mit einem Wert von 1), wenn A<B 1 (wahr) ist, unabhängig vom Wert von C. Es ist auch wahr, wenn der Wert von C>0 1 (wahr) ist, unabhängig von den Werten von A und B Daher ist es wahr, wenn eine oder beide dieser Beziehungen gelten.

Seien Sie vorsichtig, wenn Sie den OR-Operator mit einer Reihe von Vergleichen verwenden (z. B. in einer IF-, SELECT- oder WHERE-Anweisung). Denken Sie daran, dass nur ein Vergleich in einer Reihe von ODER-Vergleichen wahr sein muss, um eine Bedingung wahr zu machen, und jede nicht Null verschiedene, nicht fehlende Konstante wird immer als wahr ausgewertet (siehe Boolesche numerische Ausdrücke). Daher ist die folgende Subset-IF-Anweisung immer wahr:

SAS wertet zuerst X=1 aus, und das Ergebnis kann entweder wahr oder falsch sein. Da jedoch die 2 als nicht null und nicht fehlend (wahr) ausgewertet wird, ist der gesamte Ausdruck wahr. In dieser Aussage ist die Bedingung jedoch nicht unbedingt wahr, da jeder Vergleich als wahr oder falsch bewertet werden kann:

Der Präfixoperator NOT ist ebenfalls ein logischer Operator. Das Ergebnis, wenn NOT vor eine Größe gesetzt wird, deren Wert 0 (falsch) ist, ist 1 (wahr). Das heißt, das Ergebnis der Negation einer falschen Aussage ist 1 (wahr). Wenn beispielsweise X=Y 0 (falsch) ist, dann ist NOT(X=Y) 1 (wahr). Das Ergebnis von NOT vor einer Größe, deren Wert fehlt, ist ebenfalls 1 (wahr). Das Ergebnis von NOT vor einer Größe mit einem Wert ungleich Null, der nicht fehlt, ist 0 (falsch). Das heißt, das Ergebnis der Negation einer wahren Aussage ist 0 (falsch).

Die folgenden beiden Ausdrücke sind beispielsweise äquivalent:

Außerdem ist NOT(A&B) äquivalent zu NOT A|NOT B und NOT(A|B) ist dasselbe wie NOT A & NOT B. Zum Beispiel sind die folgenden beiden Ausdrücke äquivalent:

In rechnerischen Begriffen ist ein Wert von true eine 1 und ein Wert von false ist eine 0. In SAS ist jeder numerische Wert außer 0 oder fehlt wahr, und ein Wert von 0 oder fehlt ist falsch. Daher kann eine numerische Variable oder ein numerischer Ausdruck in einer Bedingung allein stehen. Wenn ihr Wert eine andere Zahl als 0 ist oder fehlt, ist die Bedingung wahr, wenn ihr Wert 0 ist oder fehlt, ist die Bedingung falsch.

Angenommen, Sie möchten die Variable REMARKS abhängig davon ausfüllen, ob der Wert von COST für eine bestimmte Beobachtung vorhanden ist. Sie können die IF-THEN-Anweisung wie folgt schreiben:

Diese Aussage ist äquivalent zu:

Ein numerischer Ausdruck kann einfach eine numerische Konstante sein, wie folgt:

Der von einer Funktion zurückgegebene numerische Wert ist auch ein gültiger numerischer Ausdruck:

Die Operatoren MIN und MAX werden verwendet, um den minimalen oder maximalen Wert von zwei Größen zu finden. Umgeben Sie die Operatoren mit den beiden Größen, deren Minimal- oder Maximalwert Sie wissen möchten. Der Operator MIN (><) gibt den niedrigeren der beiden Werte zurück. Der Operator MAX (<>) gibt den höheren der beiden Werte zurück. Wenn beispielsweise A<B, dann gibt A><B den Wert von A zurück.

Wenn fehlende Werte Teil des Vergleichs sind, verwendet SAS die Sortierreihenfolge für fehlende Werte, die in Reihenfolge der fehlenden Werte beschrieben ist. Der maximale Wert, der von .A<>.Z zurückgegeben wird, ist beispielsweise der Wert .Z.

Hinweis: In einer WHERE-Anweisung oder -Klausel entspricht der <>-Operator NE.

Der Verkettungsoperator (||) verkettet Zeichenwerte. Die Ergebnisse einer Verkettungsoperation werden normalerweise in einer Variablen mit einer Zuweisungsanweisung gespeichert, wie in level='grade '||'A' . Die Länge der resultierenden Variablen ist die Summe der Längen jeder Variablen oder Konstanten in der Verkettungsoperation, es sei denn, Sie verwenden eine LENGTH- oder ATTRIB-Anweisung, um eine andere Länge für die neue Variable anzugeben.

Der Verkettungsoperator schneidet führende oder nachgestellte Leerzeichen nicht ab. Wenn Variablen mit abschließenden Leerzeichen aufgefüllt werden, überprüfen Sie die Länge der Variablen und verwenden Sie die TRIM-Funktion, um abschließende Leerzeichen von Werten zu entfernen, bevor Sie sie verketten. Beschreibungen und Beispiele für zusätzliche Zeichenfunktionen finden Sie unter SAS-Sprachreferenz: Wörterbuch.

In diesem DATA-Schritt enthält der Wert, der sich aus der Verkettung ergibt, beispielsweise Leerzeichen, da die Länge der Variablen COLOR acht beträgt:

Der Wert von GAME ist 'Black Jack'. Um dieses Problem zu beheben, verwenden Sie die TRIM-Funktion in der Verkettungsoperation wie folgt:

Diese Anweisung erzeugt einen Wert von 'Blackjack' für die Variable GAME. Die folgenden zusätzlichen Beispiele veranschaulichen die Verwendung des Verkettungsoperators:

Hat A den Wert 'fortune' , B den Wert 'five' und C den Wert 'hundert' , dann ergibt die folgende Anweisung den Wert 'fortunefivehundred' für die Variable D:

In diesem Beispiel wird der Wert einer Variablen mit einer Zeichenkonstanten verkettet.

Da die Verkettungsoperation keine Leerzeichen abschneidet, erzeugt der folgende Ausdruck den Wert 'JOHN SMITH':

In diesem Beispiel wird die PUT-Funktion verwendet, um einen numerischen Wert in einen Zeichenwert umzuwandeln. Die Funktion TRIM dient zum Trimmen von Rohlingen.

Reihenfolge der Auswertung in zusammengesetzten Ausdrücken zeigt die Reihenfolge der Auswertung in zusammengesetzten Ausdrücken. Die Tabelle enthält die folgenden Spalten:

listet die Priorität der Bewertung auf. In zusammengesetzten Ausdrücken wertet SAS zuerst den Teil des Ausdrucks aus, der Operatoren in Gruppe I enthält, dann jede Gruppe der Reihe nach.

listet die Regeln auf, die bestimmen, welcher Teil des Ausdrucks von SAS zuerst ausgewertet wird. Klammern werden häufig in zusammengesetzten Ausdrücken verwendet, um Operanden zu gruppieren. Ausdrücke in Klammern werden vor denen außerhalb davon ausgewertet. Die Regeln listen auch auf, wie ein zusammengesetzter Ausdruck, der mehr als einen Operator aus derselben Gruppe enthält, ausgewertet wird.

listet die Symbole auf, die Sie verwenden, um Vergleiche, Operationen und Berechnungen anzufordern.

listet alternative Formen des Symbols auf. In einigen Fällen, beispielsweise wenn Ihre Tastatur keine Sonderzeichen unterstützt, sollten Sie das alternative Formular verwenden.

enthält ein Beispiel für die Verwendung des Symbols oder der mnemonischen Entsprechung in einem SAS-Ausdruck.

Symbol Mnemonisches Äquivalent Beispiel
&Ampere UND (a>b und c>d)
| ODER (Tabellenhinweis 1) (a>b oder c>d)
! ODER
¦ ODER
¬ NICHT (Tabellenhinweis 2) nicht(a>b)
NICHT
Auswertungsreihenfolge in zusammengesetzten Ausdrücken
Priorität Bewertungsreihenfolge Symbole Mnemonisches Äquivalent Definition Beispiel
Gruppe I rechts nach links **
Potenzierung (Tabellenanmerkung 1)


+
positives Präfix (Tabellenanmerkung 2)


-
negatives Präfix (Tabellenanmerkung 3)


ˆ ¬

NICHT logisch nicht (Tabellenanmerkung 4)


>< MINDEST Minimum (Tabellenanmerkung 5)


<> MAX maximal
Gruppe II links nach rechts *
Multiplikation


/
Einteilung
Gruppe III links nach rechts +
Zusatz


-
Subtraktion
Gruppe IV links nach rechts || ¦¦ !!
Zeichenwerte verketten (Tabellenhinweis 6)
Gruppe V (Tabellenanmerkung 7) von links nach rechts (Tabellenhinweis 8) < LT weniger als


<= LE Gleich oder kleiner als


= EQ gleicht


¬= NE Nicht gleichzusetzen mit


>= GE größer als oder gleich wie


> GT größer als



IM gleich einem aus einer Liste
Gruppe VI links nach rechts &Ampere UND logisch und
Gruppe VII links nach rechts | ¦ ! ODER logisch oder (Tabellenhinweis 9)

TABELLE ANMERKUNG 1: Da Operatoren der Gruppe I von rechts nach links ausgewertet werden, wird der Ausdruck x=2**3**4 als x=(2**(3**4)) ausgewertet.

TABELLE ANMERKUNG 2: Das Pluszeichen (+) kann entweder ein Präfix oder ein arithmetischer Operator sein. Ein Pluszeichen ist nur dann ein Präfixoperator, wenn es am Anfang eines Ausdrucks steht oder unmittelbar davor eine offene Klammer oder ein anderer Operator steht.

TABELLE ANMERKUNG 3: Das Minuszeichen (-) kann entweder ein Präfix oder ein arithmetischer Operator sein. Ein Minuszeichen ist nur dann ein Präfixoperator, wenn es am Anfang eines Ausdrucks steht oder unmittelbar davor eine offene Klammer oder ein anderer Operator steht.

TABELLE HINWEIS 4: Abhängig von den auf Ihrer Tastatur verfügbaren Zeichen kann das Symbol das Nicht-Zeichen (¬), die Tilde (

) oder Einfügemarke (^). Die SAS-Systemoption CHARCODE ermöglicht verschiedene andere Ersetzungen für nicht verfügbare Sonderzeichen.

TABELLE ANMERKUNG 5: Zum Beispiel wertet das SAS-System -3><-3 als -(3><-3) aus, was gleich -(-3) ist, was +3 entspricht. Dies liegt daran, dass Operatoren der Gruppe I von rechts nach links ausgewertet werden.

TABELLE ANMERKUNG 6: Abhängig von den auf Ihrer Tastatur verfügbaren Zeichen kann das als Verkettungsoperator verwendete Symbol ein doppelter vertikaler Strich (||), ein unterbrochener vertikaler Strich (¦¦) oder ein Ausrufezeichen (!!) sein.

TABELLE ANMERKUNG 7: Operatoren der Gruppe V sind Vergleichsoperatoren. Das Ergebnis einer Vergleichsoperation ist 1, wenn der Vergleich wahr ist, und 0, wenn er falsch ist. Fehlende Werte sind die niedrigsten in allen Vergleichsoperationen.
Die Symbole =< (kleiner oder gleich) sind auch aus Kompatibilitätsgründen mit früheren Versionen des SAS-Systems erlaubt.
Bei Zeichenvergleichen können Sie nach jedem Vergleichsoperator einen Doppelpunkt (:) verwenden, um nur das erste Zeichen oder die ersten Zeichen des Werts zu vergleichen. SAS schneidet den längeren Wert während des Vergleichs auf die Länge des kürzeren Werts ab. Wenn beispielsweise name=:'P' den Wert des ersten Zeichens von NAME mit dem Buchstaben P vergleicht.

TABELLE ANMERKUNG 8: Eine Ausnahme von dieser Regel tritt auf, wenn zwei Vergleichsoperatoren eine Größe umgeben. Der Ausdruck x<y<z wird beispielsweise als (x<y) und (y<z) ausgewertet.

TABELLENHINWEIS 9: Abhängig von den auf Ihrer Tastatur verfügbaren Zeichen kann das Symbol, das Sie für das logische oder verwenden, ein einzelner vertikaler Strich (|), ein unterbrochener vertikaler Strich () oder ein Ausrufezeichen (!) sein. Sie können auch das mnemonische Äquivalent OR verwenden.


4 Antworten 4

Sie können < und > nicht als solche in Bash-Skripten verwenden. Verwenden Sie dafür -lt und -gt:

< und > werden von der Shell verwendet, um die Umleitung von stdin oder stdout durchzuführen.

Der Vergleich, von dem Sie sagen, dass er funktioniert, besteht darin, eine Datei mit dem Namen 7 im aktuellen Verzeichnis zu erstellen.

Was && betrifft, hat das auch eine besondere Bedeutung für die Shell und wird zum Erstellen einer "UND-Liste" von Befehlen verwendet.

Die beste Dokumentation für all dies: man bash (und man test für Details zu Vergleichsoperatoren)


In Bash sollten Sie Ihre Prüfung in einem arithmetischen Kontext durchführen:

Für POSIX-Shells, die (()) nicht unterstützen, können Sie -lt und -gt verwenden.

Eine vollständige Liste der Vergleichsoperatoren erhalten Sie mit help test oder man test .

Ganzzahlen können mit diesen Operatoren verglichen werden:

Es gibt auch eine nette Sache, die manche Leute vielleicht nicht wissen:

Dieser Code druckt die kleinste Zahl aus a und b

In Bash bevorzuge ich dies, da es sich eher als bedingte Operation versteht, im Gegensatz zu (( )), was eher arithmetisch ist.

Es sei denn, ich mache komplexe Sachen wie

Aber jeder hat eben seine eigenen Vorlieben. Traurig ist, dass manche Leute ihre inoffiziellen Standards durchsetzen.

Was Ihnen erlaubt, neben arithmetischen Dingen noch etwas hinzuzufügen, was Sie mit [[ ]] tun könnten.

Dieser Code kann auch Floats vergleichen. Es verwendet AWK (es ist keine reine Bash). Dies sollte jedoch kein Problem darstellen, da AWK ein Standard-POSIX-Befehl ist, der höchstwahrscheinlich standardmäßig mit Ihrem Betriebssystem geliefert wird.

Verwenden Sie diese Funktion, um die Verwendung zu verkürzen:

Die Klammern (z. B. [[ $a -gt $b ]] oder (( $a > $b )) ) reichen nicht aus, wenn Sie auch Gleitkommazahlen verwenden möchten, es würde einen Syntaxfehler melden. Wenn Sie Float-Zahlen oder Float-Zahlen mit Integer vergleichen möchten, können Sie (( $(bc <<< ". ") )) verwenden.

Sie können mehr als einen Vergleich in die if-Anweisung aufnehmen. Beispielsweise,

Das ist hilfreich, wenn Sie überprüfen möchten, ob eine numerische Variable (integer oder nicht) innerhalb eines numerischen Bereichs liegt.

Wenn Sie Floats haben, können Sie eine Funktion schreiben und diese dann verwenden. Beispielsweise,

Ich habe dies gelöst, indem ich eine kleine Funktion verwendet habe, um Versionszeichenfolgen in einfache ganzzahlige Werte umzuwandeln, die verglichen werden können:


Vergleich verschiedener Datentypen ^

Wie bei den meisten Skriptsprachen können Sie in PowerShell Vergleichsoperatoren auf verschiedene Datentypen anwenden. Dies ist jedoch vor allem bei numerischen Werten sinnvoll, obwohl der Vergleich für Strings möglich ist. Bei Strings nur -eq und -ne sind nützlich, um Gleichheit oder Ungleichheit zu bestimmen. Größenvergleiche von Strings werden selten benötigt.

ergibt TRUE, aber nicht, weil „Peter“ eine längere Zeichenfolge als „Paul“ ist. Stattdessen vergleicht die Operation die Zeichenfolgen Zeichen für Zeichen, bis sie zwei verschiedene Zeichen erkennt. Der mit dem größeren ASCII-Wert bestimmt, ob ein String als größer oder kleiner angesehen wird. Im obigen Beispiel ist „Peter“ größer als „Paul“, weil „e“ einen größeren ASCII-Wert als „a“ hat.

Verwechslungsgefahr mit Zuweisungsoperator

Ein möglicher Fallstrick, auf den man stoßen könnte, ist die Verwirrung von -eq mit „=“. In PowerShell dient das Gleichheitszeichen als Zuweisungsoperator und nicht als Vergleichsoperator. Wenn Sie es in einer if-Anweisung falsch verwenden, kann dies zu unerwünschten Ergebnissen führen, wenn eine Variable auf der linken Seite der Anweisung steht:

In solchen Fällen ist das Ergebnis der if-Bedingung immer wahr, die abhängigen Befehle werden immer ausgeführt und der Wert der Variablen wird zerstört.


Viele Prozessoren haben Befehlssätze, die eine solche Operation auf primitiven Typen unterstützen. Einige Maschinen haben vorzeichenbehaftete Ganzzahlen basierend auf einer Vorzeichen-und-Größen- oder Einerkomplement-Darstellung (siehe Vorzeichendarstellungen), die beide eine differenzierte positive und negative Null ermöglichen. Dies verletzt die Trichotomie nicht, solange eine konsistente Gesamtordnung angenommen wird: entweder –0 = +0 oder –0 < +0 ist gültig. Gängige Gleitkommatypen haben jedoch eine Ausnahme von der Trichotomie: Es gibt einen speziellen Wert "NaN" (Not a Number), so dass x < NaN, x > NaN, und x = NaN sind für alle Gleitkommawerte alle falsch x (einschließlich NaN selbst).

Fähigkeiten Bearbeiten

In C führen die Funktionen strcmp und memcmp jeweils einen Drei-Wege-Vergleich zwischen Strings und Speicherpuffern durch. Sie geben eine negative Zahl zurück, wenn das erste Argument lexikographisch kleiner als das zweite ist, Null, wenn die Argumente gleich sind, andernfalls eine positive Zahl. Diese Konvention, das "Vorzeichen der Differenz" zurückzugeben, wird durch die Standard-Sortierfunktion qsort auf beliebige Vergleichsfunktionen erweitert, die eine Vergleichsfunktion als Argument verwendet und von ihr verlangt, dass sie sich daran hält.

In C++ fügt die C++20-Revision den "Raumschiffoperator" <=> hinzu, der in ähnlicher Weise das Vorzeichen der Differenz zurückgibt und je nach Strenge des Vergleichs auch verschiedene Typen (konvertierbar in ganze Zahlen mit Vorzeichen) zurückgeben kann. [1]

In Perl (nur für numerische Vergleiche wird der cmp-Operator für lexikalische Stringvergleiche verwendet), PHP (seit Version 7), Ruby und Apache Groovy gibt der "Raumschiffoperator" <=> die Werte −1, 0 oder 1 zurück abhängig davon, ob A < B, A = B bzw. A > B ist. Die Funktionen Python 2.x cmp (entfernt in 3.x), OCaml Compare und Kotlin CompareTo berechnen dasselbe. In der Haskell-Standardbibliothek ist die Drei-Wege-Vergleichsfunktion Compare für alle Typen in der Klasse Ord definiert, die den Typ Ordering zurückgibt, dessen Werte LT (kleiner als), EQ (gleich) und GT (größer als) sind: [2 ]

Viele objektorientierte Sprachen haben ein Drei-Wege-Vergleichsverfahren, das einen Drei-Wege-Vergleich zwischen dem Objekt und einem anderen gegebenen Objekt durchführt. In Java hat beispielsweise jede Klasse, die die Schnittstelle Comparable implementiert, eine Methode CompareTo, die entweder eine negative ganze Zahl, null oder eine positive ganze Zahl zurückgibt oder eine NullPointerException auslöst (wenn eines oder beide Objekte null sind). Ebenso verfügt in .NET Framework jede Klasse, die die IComparable-Schnittstelle implementiert, über eine solche CompareTo-Methode.

Seit Java-Version 1.5 kann dasselbe mit der statischen Methode Math.signum berechnet werden, wenn der Unterschied ohne Rechenprobleme wie den unten erwähnten arithmetischen Überlauf bekannt ist. Viele Computersprachen erlauben die Definition von Funktionen, so vergleichen(A,B) geeignet gestaltet werden könnte, aber die Frage ist, ob seine interne Definition eine Art Drei-Wege-Syntax verwenden kann oder auf wiederholte Tests zurückgreifen muss.

Bei der Implementierung eines Dreiwegevergleichs, bei dem kein Dreiwegevergleichsoperator oder -verfahren bereits verfügbar ist, werden häufig zwei Vergleiche kombiniert, wie beispielsweise A = B und A < B oder A < B und A > B. Im Prinzip , könnte ein Compiler folgern, dass diese beiden Ausdrücke durch nur einen Vergleich mit anschließendem mehrfachen Testen des Ergebnisses ersetzt werden könnten, aber diese Optimierung wird in Texten zu diesem Thema nicht erwähnt.

In einigen Fällen kann ein Drei-Wege-Vergleich simuliert werden, indem A und B subtrahiert und das Vorzeichen des Ergebnisses untersucht wird, wobei spezielle Anweisungen zum Prüfen des Vorzeichens einer Zahl verwendet werden. Dies erfordert jedoch, dass der Typ von A und B einen genau definierten Unterschied aufweist. Vorzeichenbehaftete Ganzzahlen mit fester Breite können beim Subtrahieren überlaufen, Gleitkommazahlen haben den Wert NaN mit undefiniertem Vorzeichen und Zeichenketten haben keine Differenzfunktion entsprechend ihrer Gesamtordnung. Auf Maschinenebene wird der Überlauf normalerweise verfolgt und kann verwendet werden, um die Reihenfolge nach der Subtraktion zu bestimmen, aber diese Informationen sind normalerweise nicht für höhere Sprachen verfügbar.

In einem Fall einer Drei-Wege-Bedingung, die von der Programmiersprache bereitgestellt wird, berücksichtigt Fortrans jetzt veraltete arithmetische Drei-Wege-IF-Anweisung das Vorzeichen eines arithmetischen Ausdrucks und bietet drei Labels zum Springen entsprechend dem Vorzeichen des Ergebnisses:

Die allgemeine Bibliotheksfunktion strcmp in C und verwandten Sprachen ist ein lexikographischer Dreiwegevergleich von Strings, jedoch fehlt diesen Sprachen ein allgemeiner Dreiwegevergleich anderer Datentypen.

Raumschiff-Betreiber Bearbeiten

Der Dreiwege-Vergleichsoperator für Zahlen wird in Perl, Ruby, Apache Groovy, PHP, Eclipse Ceylon und C++ als <=> bezeichnet und heißt der Raumschiffbetreiber. [3]

Die Herkunft des Namens ist darauf zurückzuführen, dass er Randal L. Schwartz an das Raumschiff in einer HP BASIC erinnert Star Trek Spiel. [4] Ein anderer Programmierer hat vorgeschlagen, dass es so benannt wurde, weil es dem TIE-Jäger von Darth Vader in der ähnlich sah Krieg der Sterne Saga. [5]

Zusammengesetzte Datentypen Bearbeiten

Drei-Wege-Vergleiche haben die Eigenschaft, im Gegensatz zu Zwei-Wege-Vergleichen leicht lexikographische Vergleiche von nicht-primitiven Datentypen zu erstellen und aufzubauen.

Hier ist ein Kompositionsbeispiel in Perl.

Beachten Sie, dass cmp in Perl für Strings steht, da <=> für Zahlen steht. Zwei-Wege-Äquivalente sind in der Regel weniger kompakt, aber nicht unbedingt weniger lesbar. Das Obige nutzt die Kurzschlussauswertung des || -Operator und die Tatsache, dass 0 in Perl als falsch gilt. Als Ergebnis, wenn der erste Vergleich gleich ist (also zu 0 ausgewertet wird), wird er zum zweiten Vergleich "durchfallen", und so weiter, bis er einen findet, der nicht null ist, oder bis er das Ende erreicht.

In einigen Sprachen, einschließlich Python, Ruby, Haskell usw., erfolgt der Vergleich von Listen lexikographisch, was bedeutet, dass es möglich ist, eine Vergleichskette wie im obigen Beispiel aufzubauen, indem die Werte beispielsweise in der gewünschten Reihenfolge in Listen eingefügt werden, auf Rubin:


1.2: Zahlenvergleiche mit < ,> und = - Mathematik

Ein binärer Vergleichsoperator vergleicht zwei Variablen oder Mengen. Beachten Sie, dass beim Vergleich von Ganzzahlen und Zeichenfolgen unterschiedliche Operatoren verwendet werden.

ist größer oder gleich

ist kleiner oder gleich (innerhalb von doppelten Klammern)

ist größer als (innerhalb doppelter Klammern)

ist größer oder gleich (innerhalb von doppelten Klammern)

if [ "$a"="$b" ] ist nicht gleichbedeutend mit obigem.

[[ $a == z* ]] # Wahr, wenn $a mit einem "z" beginnt (Mustervergleich). [[ $a == "z*" ]] # Wahr, wenn $a gleich z* ist (Literalübereinstimmung). [ $a == z* ] # Dateiglobbing und Wortsplitting finden statt. [ "$a" == "z*" ] # Wahr, wenn $a gleich z* ist (Literalübereinstimmung). # Danke, St phane Chazelas

Dieser Operator verwendet den Mustervergleich innerhalb einer [[ . ]] bauen.

is greater than, in ASCII alphabetical order

Note that the ">" needs to be escaped within a [ ] construct.

string is null , that is, has zero length

String='' # Zero-length ("null") string variable. if [ -z "$String" ] then echo "$String is null." else echo "$String is NOT null." fi # $String is null.

The -n test requires that the string be quoted within the test brackets. Using an unquoted string with ! -z , or even just the unquoted string alone within test brackets (see Example 7-6 ) normally works, however, this is an unsafe practice. Always quote a tested string. [1]

Example 7-5. Arithmetic and string comparisons

#!/bin/bash a=4 b=5 # Here "a" and "b" can be treated either as integers or strings. # There is some blurring between the arithmetic and string comparisons, #+ since Bash variables are not strongly typed. # Bash permits integer operations and comparisons on variables #+ whose value consists of all-integer characters. # Caution advised, however. echo if [ "$a" -ne "$b" ] then echo "$a is not equal to $b" echo "(arithmetic comparison)" fi echo if [ "$a" != "$b" ] then echo "$a is not equal to $b." echo "(string comparison)" # "4" != "5" # ASCII 52 != ASCII 53 fi # In this particular instance, both "-ne" and "! EXAMPLE" >

Example 7-6. Testing whether a string is null

#!/bin/bash # str-test.sh: Testing null strings and unquoted strings, #+ but not strings and sealing wax, not to mention cabbages and kings . . . # Using if [ . ] # If a string has not been initialized, it has no defined value. # This state is called "null" (not the same as zero!). if [ -n $string1 ] # string1 has not been declared or initialized. then echo "String "string1" is not null." else echo "String "string1" is null." fi # Wrong result. # Shows $string1 as not null, although it was not initialized. echo # Let's try it again. if [ -n "$string1" ] # This time, $string1 is quoted. then echo "String "string1" is not null." else echo "String "string1" is null." fi # Quote strings within test brackets! echo if [ $string1 ] # This time, $string1 stands naked. then echo "String "string1" is not null." else echo "String "string1" is null." fi # This works fine. # The [ . ] test operator alone detects whether the string is null. # However it is good practice to quote it (if [ "$string1" ]). # # As Stephane Chazelas points out, # if [ $string1 ] has one argument, "]" # if [ "$string1" ] has two arguments, the empty "$string1" and "]" echo string1=initialized if [ $string1 ] # Again, $string1 stands unquoted. then echo "String "string1" is not null." else echo "String "string1" is null." fi # Again, gives correct result. # Still, it is better to quote it ("$string1"), because . . . string1="a = b" if [ $string1 ] # Again, $string1 stands unquoted. then echo "String "string1" is not null." else echo "String "string1" is null." fi # Not quoting "$string1" now gives wrong result! exit 0 # Thank you, also, Florian Wisser, for the "heads-up".

#!/bin/bash # zmore # View gzipped files with 'more' filter. E_NOARGS=85 E_NOTFOUND=86 E_NOTGZIP=87 if [ $# -eq 0 ] # same effect as: if [ -z "$1" ] # $1 can exist, but be empty: zmore "" arg2 arg3 then echo "Usage: `basename ` filename" >ž # Error message to stderr. exit $E_NOARGS # Returns 85 as exit status of script (error code). fi filename=$1 if [ ! -f "$filename" ] # Quoting $filename allows for possible spaces. then echo "File $filename not found!" >ž # Error message to stderr. exit $E_NOTFOUND fi if [ $ != "gz" ] # Using bracket in variable substitution. then echo "File $1 is not a gzipped file!" exit $E_NOTGZIP fi zcat $1 | more # Uses the 'more' filter. # May substitute 'less' if desired. exit $? # Script returns exit status of pipe. # Actually "exit $?" is unnecessary, as the script will, in any case, #+ return the exit status of the last command executed.


Containment operators

The containment operators ( -contains , -notcontains , -in , and -notin ) are similar to the equality operators, except that they always return a Boolean value, even when the input is a collection. These operators stop comparing as soon as they detect the first match, whereas the equality operators evaluate all input members. In a very large collection, these operators return quicker than the equality operators.

-contains and -notcontains

These operators tell whether a set includes a certain element. -contains returns True when the right-hand side (test object) matches one of the elements in the set. -notcontains returns False instead. When the test object is a collection, these operators use reference equality, i.e. they check whether one of the set's elements is the same instance of the test object.

-in and -notin

The -in and - notin operators were introduced in PowerShell 3 as the syntactic reverse of the of contains and -notcontain operators. -in returns True when the left-hand side <test-object> matches one of the elements in the set. -notin returns False instead. When the test object is a set, these operators use reference equality to check whether one of the set's elements is the same instance of the test object.

The following examples do the same thing that the examples for -contain and -notcontain do, but they are written with -in and -notin instead.


Schau das Video: Größer und kleiner (November 2021).