Perl структуры и назначения - PullRequest
2 голосов
/ 22 декабря 2011

В perldata я нашел следующие примеры и объяснения.

@foo = ('cc', '-E', $bar);

assigns the entire list value to array @foo, but

$foo = ('cc', '-E', $bar);

assigns the value of variable $bar to the scalar variable $foo. 

Это действительно смущает меня, поэтому $foo эквивалентно $bar? Как понять разницу между @foo и $foo

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

Примеры в perldata :

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

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

Это равносильно высказыванию:

'cc', '-E';
$foo = $bar;

В Perl скаляр, например $foo, может содержать только одно значение, поэтому остальная часть списка просто отбрасывается. Массив, такой как @foo, будет отбрасывать столько значений, сколько содержит список.

В Perl разрешено иметь одно и то же имя для переменных разных типов. @foo и $foo будут считаться двумя разными переменными.

3 голосов
/ 22 декабря 2011

Выражения могут иметь различное значение в зависимости от того, в каком контексте они оцениваются. Три основных контекста - это список, скаляр и void, хотя существует несколько подконтекстов скалярного контекста (булевы, строковые и числовые являются наиболееважные).

Оператор запятой не является исключением из этого правила.В контексте списка оператор запятой действует как оператор объединения списков, оценивая его операнды в контексте списка и объединяя результирующие списки в один список.Вероятно, это тот контекст, с которым вы знакомы при работе с оператором запятой.

Однако в скалярном контексте оператор запятой работает так же, как оператор запятой в C;он оценивает последовательность выражений и отбрасывает их результаты, за исключением самого правого выражения, которое он возвращает (в качестве примечания, отбрасываемые выражения оцениваются в пустом контексте, а возвращаемое выражение оценивается в скалярном контексте).Чтобы узнать, как каждый из операторов perl ведет себя в разных контекстах, я предлагаю прочитать perlop .

Чтобы полностью понять контекст, вы должны понимать, что самый внешний оператор применяет контекст на егооперанды, чьи операторы затем применяют контекст для своих операндов и т. д. (примечание другой стороны: самое внешнее выражение строки всегда вычисляется в пустом контексте).Так, например, когда оператор присваивания используется с массивом или хеш-переменной (начиная с% или @), правая часть присваивания, следовательно, оценивается в контексте списка.Однако, если переменная является скалярной, правая часть присваивания оценивается в скалярном контексте.Вот почему операторы запятой в назначениях ниже:

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

действуют совершенно по-разному.

Для получения дополнительной информации о том, как вы можете написать код, который управляет контекстом или реагирует на него, читайте оскалярные операторы и операторы массивов.

...