Выражения могут иметь различное значение в зависимости от того, в каком контексте они оцениваются. Три основных контекста - это список, скаляр и void, хотя существует несколько подконтекстов скалярного контекста (булевы, строковые и числовые являются наиболееважные).
Оператор запятой не является исключением из этого правила.В контексте списка оператор запятой действует как оператор объединения списков, оценивая его операнды в контексте списка и объединяя результирующие списки в один список.Вероятно, это тот контекст, с которым вы знакомы при работе с оператором запятой.
Однако в скалярном контексте оператор запятой работает так же, как оператор запятой в C;он оценивает последовательность выражений и отбрасывает их результаты, за исключением самого правого выражения, которое он возвращает (в качестве примечания, отбрасываемые выражения оцениваются в пустом контексте, а возвращаемое выражение оценивается в скалярном контексте).Чтобы узнать, как каждый из операторов perl ведет себя в разных контекстах, я предлагаю прочитать perlop .
Чтобы полностью понять контекст, вы должны понимать, что самый внешний оператор применяет контекст на егооперанды, чьи операторы затем применяют контекст для своих операндов и т. д. (примечание другой стороны: самое внешнее выражение строки всегда вычисляется в пустом контексте).Так, например, когда оператор присваивания используется с массивом или хеш-переменной (начиная с% или @), правая часть присваивания, следовательно, оценивается в контексте списка.Однако, если переменная является скалярной, правая часть присваивания оценивается в скалярном контексте.Вот почему операторы запятой в назначениях ниже:
@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);
действуют совершенно по-разному.
Для получения дополнительной информации о том, как вы можете написать код, который управляет контекстом или реагирует на него, читайте оскалярные операторы и операторы массивов.