Like vs Match: Battle of The Powershell Comparison Operators
P>Powershell oferece algumas formas diferentes de ver se uma corda está dentro de outra corda. O método mais comum é utilizar os operadores Like and Match. Estes dois operadores podem parecer semelhantes em funcionalidade mas, debaixo do capô, são duas bestas muito diferentes. Vamos rever cada um deles para ver qual deles ganharia uma batalha royale! Teremos duas rondas, com o seguinte sistema de pontos: um ponto pela velocidade, e um ponto pela facilidade de sintaxe. Para obter uma verdadeira comparação dos dois operadores, utilizaremos todo o texto do livro “Guerra e Paz”, de Leo Tolstoy. Para colocar o texto deste livro numa cadeia de caracteres estou a usar o parâmetro Get-Content
cmdlet com o parâmetro -Raw
, que atribui as 1.440 páginas de conteúdo numa única cadeia de caracteres em vez de uma matriz. $WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw
O concurso será para ver se o texto do romance “Guerra e Paz” contém a palavra “waldo” no final de uma frase, pelo que a cadeia de caracteres será “waldo”. Antes do início desta luta até à morte, é importante dar uma breve explicação de um operador Powershell. Depois daremos uma vista de olhos a cada um dos nossos concorrentes; queremos recordar o adversário derrotado ou, pelo menos, o parente mais próximo para notificar quando tiver terminado.
Uma breve explicação dos operadores de comparação de Powershell
Like e Match são ambos operadores de Powershell; mais especificamente, são operadores de comparação. No seu mais básico, os operadores de comparação são utilizados para comparar valores e devolver um valor booleano Verdadeiro ou Falso. No entanto, este artigo concentrar-se-á na utilização dos operadores Like and Match para encontrar uma cadeia dentro de outra cadeia. Ambos os nossos concorrentes podem fazer isto, mas cada um executa a tarefa de uma forma ligeiramente diferente.
Meet the Like operator
The Like operator is a Powershell comparison operator that uses wildcards. Um exemplo muito simples para encontrar a palavra “dia” na corda, “É um grande dia,: seria algo parecido com isto: PS> 'it is a great day' -like '*day*'
Esta afirmação devolveria um valor True
. No entanto, se eu fizer algo assim, devolveria um False
valor: PS> 'it is a great day' -like 'day'
porquê a diferença? Note os asteriscos que rodeiam day
no primeiro exemplo. Estes são wildcards que devem estar presentes a fim de representar qualquer tipo de texto de cada lado da palavra day
. Em inglês simples, a primeira afirmação diz basicamente: “Será que a cadeia ‘é um grande dia’ tem a palavra ‘dia’ dentro dela, com qualquer texto para a esquerda ou para a direita? Entretanto, a segunda declaração diz: “Será que a corda ‘é um grande dia’ tem a palavra ‘dia’, mas nenhum texto para a esquerda e para a direita?” O operador Like funciona bem para uma correspondência simples como esta quando se tem uma corda simples sem caracteres especiais, e quando se sabe exactamente qual a corda que se procura.
Meet the Match operator
The Match operator is another Powershell comparison operator. Embora semelhante a Like, é muito mais Powershell (mas um pouco mais complicado). O operador de fósforos usa expressões regulares (regex). Isto é um enorme benefício e dá Match
uma perna definida em Like
. No entanto, se nunca usou expressões regulares antes, prepare-se. Um colega de trabalho, ao descrever expressões regulares, disse uma vez: “Quem criou expressões regulares tinha de estar drogado”. Isto não podia ser mais verdadeiro. Vamos novamente com o nosso exemplo anterior. PS> 'it is a great day' -match '*day*'
Acabei de substituir a palavra like
por match
. O que acha que aconteceria? Voltaria True,
como o nosso exemplo anterior, ou algo mais? Pode ver que funciona de forma diferente de Like
. Não está apenas a trabalhar com texto simples. Entrou no reino de regex, e as coisas não são as mesmas no mundo regex. Para fazer funcionar correctamente este trabalho com o operador de jogo teria de remover os asteriscos, porque os asteriscos têm um significado especial no mundo regex. PS> 'it is a great day' -match 'day'
O operador de jogo pode fazer muito mais do que simples jogos como este, mas para esta batalha tentarei torná-la justa apenas comparando atributos semelhantes. Com fundos fora do caminho, vamos ao que interessa.
Round No. 1: Tipo vs. Partida: O que é mais rápido?
Like Vamos ver se o operador similar consegue descobrir se a nossa corda de exemplo contém “waldo,” e quão rápido foi. Bastante rápido! O operador Like foi capaz de encontrar a correspondência em cerca de 149 milissegundos. Match Now vamos trazer o operador Match e ver como ele se acumula. O vencedor aqui é claro; um ponto para o operador do jogo! Como: 0, Match: 1
Round No.2: Like vs. Match: Facilidade de sintaxe
Para tornar este round o mais igual possível, estou a definir “facilidade de sintaxe” como o operador que é mais fácil de compreender e requer menos caracteres. Como Up primeiro, o operador Like. PS> $WarAndPeaceString -like '*waldo.*'
Nada mau com oito caracteres, mas requer que se lembre dos asteriscos em cada lado da nossa cadeia de pesquisa. Match Next up, o operador Match entra no ringue e mostra-nos do que é feito! PS> $WarAndPeaceString -match 'waldo\.'
Não vejo aqui asteriscos, por isso a contagem de caracteres é apenas sete. No entanto, o que é que essa barra invertida está a fazer ali dentro? Isso é extremamente confuso. Uma vez que o operador do jogo utiliza regex, o regex exige que se escape a certos caracteres especiais na cadeia de pesquisa. Isso é demasiado estranho para um recém-chegado, por isso estou a dar Like
o ponto aqui. Como: 1, Combinar: 1 Da nossa batalha puramente de língua-na-bochecha parece que os operadores do Like e Match são uniformemente combinados. Embora isto possa ou não ser a realidade real, espero que tenha conseguido uma boa demonstração do que cada operador pode fazer, juntamente com um pouco sobre as diferenças de sintaxe.