Dopasowanie do wzorca: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
m dr. tech.
Paweł Ziemian BOT (dyskusja | edycje)
m Zamieniam przestarzały tag 'source' na 'syntaxhighlight'
Linia 7: Linia 7:
== Wyrażenia regularne ==
== Wyrażenia regularne ==
W większości nowych języków wyrażeń regularnych można używać jako wzorców, np ([[Perl]]):
W większości nowych języków wyrażeń regularnych można używać jako wzorców, np ([[Perl]]):
<source lang="perl">
<syntaxhighlight lang="perl">
if ($numer_ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/)
if ($numer_ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/)
{
{
Linia 14: Linia 14:
# nie pasuje do wzorca
# nie pasuje do wzorca
}
}
</syntaxhighlight>
</source>


Dopasowywanie to jest jednym z głównych źródeł siły ekspresji i zwięzłości Perla i innych nowych języków ([[Ruby (język programowania)|Ruby]], [[PHP]], [[Python]] itd.). Analogiczny kod w [[C (język programowania)|C]] musiałby korzystać z biblioteki zapewniającej dopasowywane do wzorców (np. [[PCRE]]), lub byłby proporcjonalnie gigantyczny, i zarazem mało czytelny i z dużymi szansami na wystąpienie błędów.
Dopasowywanie to jest jednym z głównych źródeł siły ekspresji i zwięzłości Perla i innych nowych języków ([[Ruby (język programowania)|Ruby]], [[PHP]], [[Python]] itd.). Analogiczny kod w [[C (język programowania)|C]] musiałby korzystać z biblioteki zapewniającej dopasowywane do wzorców (np. [[PCRE]]), lub byłby proporcjonalnie gigantyczny, i zarazem mało czytelny i z dużymi szansami na wystąpienie błędów.

Wersja z 23:51, 17 kwi 2020

Dopasowanie do wzorca to operacja, gdzie pewne wyrażenie sprawdza się ze wzorcem, w którym może znajdować się jedno lub więcej "wolnych miejsc". W wyniku, o ile nastąpiło dopasowanie otrzymuje się listę wyrażeń które dopasowały się do wolnych miejsc wzorca.

Dopasowywanie do wzorca jest bardzo ekspresywną techniką programistyczną. Dwa najpopularniejsze systemy to:

Wyrażenia regularne

W większości nowych języków wyrażeń regularnych można używać jako wzorców, np (Perl):

if ($numer_ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/)
{
    # pasuje do wzorca, kolejne liczby w $1 $2 $3 $4
} else {
    # nie pasuje do wzorca
}

Dopasowywanie to jest jednym z głównych źródeł siły ekspresji i zwięzłości Perla i innych nowych języków (Ruby, PHP, Python itd.). Analogiczny kod w C musiałby korzystać z biblioteki zapewniającej dopasowywane do wzorców (np. PCRE), lub byłby proporcjonalnie gigantyczny, i zarazem mało czytelny i z dużymi szansami na wystąpienie błędów.

Wzorce symboliczne

W językach funkcyjnych zwykle używa się wzorców symbolicznych - termów ze zmiennymi, które dopasowuje się do danego wyrażenia przez unifikację. Dostępny jest również specjalny symbol uniwersalny, pasujący do każdego obiektu; w wielu językach to znak podkreślenia _.

Na przykład (w Ocamlu) zamiana wartości liczbowej na ciąg znaków z użyciem dopasowania można zrealizować następująco:

match liczba with
     0 -> "zero"
|    1 -> "jeden"
|    2 -> "dwa"
|    _ -> "inna liczba"

To samo można uzyskać instrukcją warunkową:

if liczba = 0 then "zero" else
if liczba = 1 then "jeden" else
if liczba = 2 then "dwa" else "inna liczba"

Jednak zapis jest bardziej rozwlekły i mniej czytelny.

Jeszcze inny przykład wykorzystujący konstruktory list; zapis x::lista oznacza doklejenie na początek listy elementu x, wynikiem jest nowa lista.

match zmienna with
           [] -> "Lista jest pusta"
|       x::[] -> "Lista ma jeden element: " ^ x
|    x::y::[] -> "Lista ma dwa elementy: " ^ x ^ " i " ^ y
| x::y::z::[] -> "Lista ma trzy elementy: " ^ x ^ ", " ^ y ^" i " ^ z
| x::y::z::_  -> "Lista ma więcej niż trzy elementy: " ^ x ^ ", " ^ y ^", " ^ z ^ "..."

Czy też przekształcać symbole w inne wyrażenia (Ocaml, kod z texvc):

let get_encoding = function
    UTF8   -> "\\usepackage{ucs}\n\\usepackage[utf8]{inputenc}\n"
  | LATIN1 -> "\\usepackage[latin1]{inputenc}\n"
  | LATIN2 -> "\\usepackage[latin2]{inputenc}\n"