Еще лучший вопрос: почему он не печатает что-то вроде array {0x1232ef} .Предполагается, что для печати выводится строка, а @a
не является скаляром.
Черт, даже лучше: это скалярный контекст, так почему бы не напечатать 5
, который является количеством элементов вмассив.Вот как:
print scalar @a;
будет печататься.
Вместо этого команда print
использует некоторые возможности, чтобы попытаться сделать то, что вы хотели, а не то, что вы сказали, что хотите.
Давайте посмотрим на эту маленькую программу:
@a = qw(a b c d e);
print "@a"; #prints "a b c d e"
print "\n";
print @a; #prints "abcde"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"
Обратите внимание, что print @a
печатает abcde
, но если я добавлю \n
в конце, она напечатает @a
в скалярном контексте.
Посмотрите на Perldoc при печати (попробуйте команду perldoc -f print
. В большинстве систем вся документация по Perl доступна через perldoc
)
* print LIST
* print
Prints a string or a list of strings. Returns true if successful[...]
Ах!Если задан список, будет напечатан список строк.
Текущее значение $, (если есть) печатается между каждым элементом LIST.Текущее значение $ \ (если есть) печатается после того, как был напечатан весь LIST.Поскольку print принимает LIST, все в LIST оценивается в контексте списка, включая любые подпрограммы, чьи списки возврата вы передаете для печати.
Давайте попробуем новую программу:
@a = qw(a b c d e);
$, = "--";
print "@a"; #prints "a b c d e"
print "\n";
print @a; #prints "a--b--c--d--e"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"
Хммм ... $,
добавил двойные черточки между элементами списка, но это не повлияло на @a
в кавычках.И, если $,
упоминается в perldoc
, почему все болтают о $"
?
Давайте посмотрим на perldoc perlvar
* $LIST_SEPARATOR
* $"
When an array or an array slice is interpolated into a double-quoted string or a
similar context such as /.../ , its elements are separated by this value. Default
is a space. For example, this:
print "The array is: @array\n";
is equivalent to this:
print "The array is: " . join($", @array) . "\n";
Mnemonic: works in double-quoted context.
Итак, это все объясняет!
По умолчанию $"
- это один пробел, а по умолчанию $,
- ноль.Вот почему мы получили то, что получили!
Еще одна программа ...
@a = qw(a b c d e);
$, = "--";
$" = "++";
print "@a"; #prints "a++b++c++d++e"
print "\n";
print @a; #prints "a--b--c--d--e"
print "\n";
print @a . "\n"; #prints "5"
print scalar @a; #prints "5"