Articles

Like vs Match: La battaglia degli operatori di confronto in Powershell

Powershell offre alcuni modi diversi per vedere se una stringa è dentro un’altra stringa. Il metodo più comune è quello di usare gli operatori Like e Match. Questi due operatori possono sembrare simili come funzionalità ma, sotto il cofano, sono due bestie molto diverse. Esaminiamo ognuno di essi per vedere quale vincerebbe in una battle royale! Avremo due round, con il sistema di punti come segue: un punto per la velocità, e un punto per la facilità di sintassi. Per avere un vero confronto tra i due operatori useremo l’intero testo del libro “Guerra e Pace”, di Leo Tolstoj. Per ottenere il testo di questo libro in una stringa sto usando il cmdlet Get-Content con il parametro -Raw, che assegna le 1.440 pagine di contenuto in una singola stringa piuttosto che in un array. $WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw La gara sarà quella di vedere se il testo del romanzo “Guerra e Pace” contiene la parola “waldo” alla fine di una frase, quindi la stringa sarà “waldo”. Prima che questa lotta alla morte abbia inizio, è importante dare una breve spiegazione di un operatore Powershell. Daremo poi un’occhiata a ciascuno dei nostri contendenti; vogliamo ricordare l’avversario perdente o, almeno, il parente più prossimo da avvisare quando è finita.

Una breve spiegazione degli operatori di confronto Powershell

Like e Match sono entrambi operatori Powershell; più specificamente, sono operatori di confronto. Nella loro forma più elementare, gli operatori di confronto sono utilizzati per confrontare i valori e restituire un valore booleano True o False. Tuttavia, questo articolo si concentrerà sull’uso degli operatori Like e Match per trovare una stringa dentro un’altra stringa. Entrambi i nostri contendenti possono farlo, ma ognuno esegue il compito in modo leggermente diverso.

Incontra l’operatore Like

L’operatore Like è un operatore di confronto Powershell che utilizza i caratteri jolly. Un esempio molto semplice per trovare la parola “day” nella stringa, “It is a great day,: would go something like this: PS> 'it is a great day' -like '*day*' Questa dichiarazione restituirebbe un valore True. Tuttavia, se faccio qualcosa come questo, restituirebbe un valore FalsePS> 'it is a great day' -like 'day' Perché questa differenza? Notate gli asterischi che circondano day nel primo esempio. Questi sono caratteri jolly che devono essere presenti per rappresentare qualsiasi tipo di testo su entrambi i lati della parola day. In parole povere, la prima affermazione sta sostanzialmente dicendo: “La stringa ‘è un gran giorno’ ha la parola ‘giorno’ al suo interno, con qualsiasi testo a sinistra o a destra? Nel frattempo, la seconda affermazione dice: “La stringa ‘è un gran giorno’ ha la parola ‘giorno’ al suo interno, ma nessun testo a sinistra e a destra? L’operatore Like funziona bene per le corrispondenze semplici come questa, quando hai una stringa semplice senza caratteri speciali, e quando sai esattamente quale stringa stai cercando.

Incontra l’operatore Match

L’operatore Match è un altro operatore di confronto Powershell. Sebbene sia simile a Like, è molto più Powershell (ma anche un po’ più complicato). L’operatore Match usa espressioni regolari (regex). Questo è un enorme vantaggio e dà a Match un netto vantaggio su Like. Tuttavia, se non avete mai usato le espressioni regolari prima, preparatevi. Un collega, descrivendo le espressioni regolari, una volta ha detto: “Chi ha creato le espressioni regolari doveva essere drogato”. Questo non potrebbe essere più veritiero. Riprendiamo la nostra precedente stringa di esempio. PS> 'it is a great day' -match '*day*' Ho appena sostituito la parola like con match. Cosa pensate che succederebbe? Restituirebbe True, come il nostro esempio precedente, o qualcos’altro? regexfailure Potete vedere che funziona diversamente da Like. Non stai solo lavorando con del semplice testo. Siete entrati nel regno della regex, e le cose non sono le stesse nel mondo della regex. Per far funzionare correttamente questo con l’operatore Match dovreste rimuovere gli asterischi, perché gli asterischi hanno un significato speciale nel mondo regex. PS> 'it is a great day' -match 'day' L’operatore Match può fare molto di più che semplici corrispondenze come questa, ma per questa battaglia cercherò di renderla giusta confrontando solo attributi simili. Con gli sfondi fuori dai piedi, passiamo agli affari.

Round No. 1: Like vs. Match: Qual è più veloce?

Like Vediamo se l’operatore like può scoprire se la nostra stringa di esempio contiene “waldo”, e quanto velocemente. waldolikeresult Piuttosto veloce! L’operatore Like è stato in grado di trovare la corrispondenza in circa 149 millisecondi. Match Ora portiamo l’operatore Match e vediamo come si comporta. waldomatchresult Il vincitore qui è chiaro; un punto per l’operatore match! Like: 0, Match: 1

Round No.2: Like vs. Match: Facilità di sintassi

Per rendere questo round il più equo possibile sto definendo “facilità di sintassi” come l’operatore che è il più facile da capire e richiede meno caratteri. Per primo, l’operatore Like Up. PS> $WarAndPeaceString -like '*waldo.*' Non è affatto male con otto caratteri, ma richiede di ricordare gli asterischi ai lati della nostra stringa di ricerca. Match A seguire, l’operatore Match sale sul ring e ci mostra di che pasta è fatto! PS> $WarAndPeaceString -match 'waldo\.' Non vedo asterischi qui, quindi il numero di caratteri è solo sette. Tuttavia, cosa ci fa quel backslash lì dentro? È estremamente confuso. Dato che l’operatore match usa la regex, la regex richiede l’escape di alcuni caratteri speciali nella stringa di ricerca. Questo è troppo strano per un nuovo arrivato, quindi sto dando Like il punto qui. Like: 1, Match: 1 Dalla nostra battaglia puramente linguistica sembra che gli operatori Like e Match siano alla pari. Anche se questa può essere o non essere la realtà, spero che abbiate avuto una buona dimostrazione di ciò che ogni operatore può fare, insieme ad un po’ di informazioni sulle differenze di sintassi.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *