Operator => (gruba przecinek) w Perl

Operator => jest używany do oddzielania wartości. Najczęściej jest on używany przy opisie Perl mieszania. Oto przykład:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 2,
);

Operator => — to cukier syntaktyczny. Operator ten jest używany zamiast operatora przecinek ,, ale w odróżnieniu od operatora przecinek, widzi lewy operand jest jak wiersz, bez konieczności zawierania jej w cudzysłowie. Oto zupełnie podobny opis Perl mieszania, ale z użyciem przecinka:

▶ Run
#!/usr/bin/perl

my %h = (
    'a', 1,
    'b', 2,
);

Przy opisie mieszania zawsze lepiej użyć właśnie operator => dla podziału klucz-wartość, tak jak przy takim użyciu okazuje się bardziej przejrzysty kod.

Zamiast operatora przecinek , zawsze można użyć operatora => (ale nie odwrotnie). Ale nie zawsze tak jest warto robić. Oto jeszcze jeden opis mieszania, która działa tak samo jak dwa poprzednie, ale tak robić nie trzeba:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1 =>
    b => 2 =>
);

Operator => jest często nazywany "gruba przecinek", bo to działa jak przecinek (z jakimś dodatkiem), ale składa się z dwóch znaków, zamiast jednego.

Lewy operand

Operator => uważa ciągiem lewy operand tylko jeśli spełnione są następujące warunki:

  • lewy operand zaczyna się od litery lub znaku _
  • i lewy operand składa się tylko z liter, cyfr i znaków _

Więc oto taki kod nie będzie działać (ze względu na fakt, że w lewym opcja jest symbol -):

▶ Run
#!/usr/bin/perl

my %h = (
   some-key => 3, # error!
);

Należy wyraźnie stwierdzić some-key w cudzysłowie: 'some-key'.

Zastosowanie w хешах

Operator => w pierwszej kolejności warto użyć do opisu par wartości w хеше. On wygląda jak strzałka i przy użyciu хеше to wygląda bardzo naturalnie — klucz wskazuje na wartość. Ale operator => można używać nie tylko w хешах, ale w ogóle w jakichkolwiek listach (ale nie zawsze ma to sens). Oto przykład użycia tego operatora w tablicy:

▶ Run
#!/usr/bin/perl

my @arr = ( one => two => 'three' );

W tym przykładzie utworzono tablicę w którym znajduje się 3 wiersze. Ponieważ został użyty operator =>, to lewy operand nie ujęte w cudzysłów. Dlatego pierwsze dwa wiersze są używane bez cudzysłowu. Na prawy operand ta magia nie dotyczy, więc trzeci wiersz musiał ujęte w cudzysłów.

Ten przykład najlepiej byłoby napisać z użyciem operatora qw:

▶ Run
#!/usr/bin/perl

my @arr = qw(one two three);

Operator trzeba pisać płynnie

Operator => składa się z dwóch znaków i te dwa znaki muszą być obok siebie. Nie można umieszczać odstęp między nimi. W tym przypadku napisać = >, to będzie błąd. Oto przykład nieprawidłowego kodu:

▶ Run
#!/usr/bin/perl

my %h = (
    a = > 1, # error!
);

Jeśli uruchomić ten kod, to na ekranie pojawi się:

syntax error at script.pl line 4, near "= >"
Execution of script.pl aborted due to compilation errors.

Oficjalna dokumentacja

Oto fragment danych wyjściowych polecenia perldoc perlop o operator =>:

    The "=>" operator (sometimes pronounced "fat comma") is a synonym for the
    comma except that it causes a word on its left to be interpreted as a
    string if it begins with a letter or underscore and is composed only of
    letters, digits and underscores. This includes operands that might
    otherwise be interpreted as operators, constants, single number v-strings
    or function calls. If in doubt about this behavior, the left operand can
    be quoted explicitly.

    Otherwise, the "=>" operator behaves exactly as the comma operator or list
    argument separator, according to context.

    For example:

        use constant FOO => "something";

        my %h = ( FOO => 23 );

    is equivalent to:

        my %h = ("FOO", 23);

    It is NOT:

        my %h = ("something", 23);

    The "=>" operator is helpful in documenting the correspondence between
    keys and values in hashes, and other paired elements in lists.

        %hash = ( $key => $value );
        login( $username => $password );

    The special quoting behavior ignores precedence, and hence may apply to
    part of the left operand:

        print time.shift => "bbb";

    That example prints something like "1314363215shiftbbb", because the "=>"
    implicitly quotes the "shift" immediately on its left, ignoring the fact
    that "time.shift" is the entire left operand.

Inne artykuły