Оператор => (толстая запятая) в Perl

Оператор => используется для разделения значений. Чаще всего он используется при описании Perl хеша. Вот пример:

▶ Run
#!/usr/bin/perl

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

Оператор => — это синтаксический сахар. Этот оператор используется вместо оператора запятая ,, но в отличии от оператора запятая, он воспринимает левый операнд как строку, без необходимости заключать ее в кавычки. Вот совершенно аналогичное описание Perl хеша, но с использованием запятой:

▶ Run
#!/usr/bin/perl

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

При описании хеша лучше всегда использовать именно оператор => для разделения ключ-значение, так как при таком использовании получается более наглядный код.

Вместо оператора запятая , всегда можно использовать оператор => (но не наоборот). Но не всегда так стоит делать. Вот еще одно описание хеша, которое работает так же как два предыдущих, но так делать не надо:

▶ Run
#!/usr/bin/perl

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

Оператор => часто называют "толстая запятая", потому что он действует как запятая (с неким дополнением), но состоит из двух символов, вместо одного.

Левый операнд

Оператор => считает строкой левый операнд только если выполняются следующие условия:

  • левый операнд начинается с буквы или с символа _
  • и левый операнд состоит только из букв, цифр и символов _

Поэтому вот такой код, работать не будет (из-за того что в левом операнде есть символ -):

▶ Run
#!/usr/bin/perl

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

Необходимо явно заключить some-key в кавычки: 'some-key'.

Использование не в хешах

Оператор => в первую очередь стоит использовать для описания пар значений в хеше. Он выглядит как стрелка и при использовании в хеше это выглядит очень органично — ключ указывает на значение. Но оператор => можно использовать не только в хешах, но вообще в любых списках (но не всегда в этом есть смысл). Вот пример использования этого оператора в массиве:

▶ Run
#!/usr/bin/perl

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

В данном примере был создан массив в котором находится 3 строки. Поскольку использовался оператор =>, то левый операнд можно не заключать в кавычки. Поэтому первые две строки используются без кавычек. На правый операнд эта магия не распространяется, поэтому третью строку пришлось заключать в кавычки.

Этот пример было бы лучше написать с использованием оператора qw:

▶ Run
#!/usr/bin/perl

my @arr = qw(one two three);

Оператор нужно писать слитно

Оператор => состоит из двух символов и эти два символа должны быть рядом друг с другом. Нельзя размещать пробел между ними. В том случае если написать = >, то будет ошибка. Вот пример неправильного кода:

▶ Run
#!/usr/bin/perl

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

Если запустить этот код, то на экране появится:

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

Официальная документация

Вот фрагмент вывода команды perldoc perlop про оператор =>:

    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.

Другие статьи

Комментарии