Perl работает по контексту. То, что вы видите здесь, является скалярным в сравнении с контекстом массива. В скалярном контексте вы хотите одну вещь, поэтому Perl дает вам одну вещь, которая, вероятно, имеет смысл. Признайте контекст, и вы, вероятно, сможете выяснить, что происходит.
Когда у вас есть скаляр в левой части задания, у вас есть скалярный контекст, потому что вы хотите получить одну вещь:
my $one_thing = ...
Поместите массив справа, и вы получите массив в скалярном контексте. Дизайн Perl решил, что наиболее распространенная вещь, которую люди, вероятно, хотят в этом случае, это количество элементов:
my $one_thing = @array;
Это работает и с некоторыми другими встроенными функциями. Встроенная функция localtime
возвращает единственную строку в скалярном контексте (временную метку):
my $uid = localtime; # Tue Mar 17 11:39:47 2020
Но в контексте массива вам может потребоваться несколько вещей (где это может быть два, или один, или ноль, или десять тысяч или ...). В этом случае localtime
возвращает список вещей:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime();
Хотя вы уже знаете это, вероятно. Оператор +
использует свои операнды в качестве чисел, но оператор .
использует их как строки: философия
my $sum = '123' + 14;
my $string = '123' . 14;
Perl заключается в том, что он попытается сделать то, что глаголы ( операторы, встроенные функции, функции) пытаются сделать, а не то, что могут означать существительные (тип переменной или значения). Многие языки говорят глаголам, что делать, основываясь на существительных, поэтому встраивание Perl в один из этих ментальных модулей обычно не работает. Вам не нужно много запоминать; Я делал это довольно давно, и я до сих пор часто обращаюсь к документам.
Мы go изучили множество философских объяснений в Learning Perl.