Всем привет!
В процессе изучения Perl-а по мануалке возникли следующие вопросы:
1. Почему при фразе в мануале по Перлу:
"The elements we\'re getting from the array start with a $ because we\'re getting just a single value out of the array -- you ask for a scalar, you get a scalar."
имеет место быть такая конструкция: @foo_ar0000[0], так же как и $foo_ar0000[0], возвращающая первый элемент из массива @foo_ar0000?
Почему также @foo_ar0000[0] и @foo_ar0000->
- суть одно и то же, иными словами, что делает оператор -> ? И почему тогда $foo_ar0000[0] и $foo_ar0000->
- не одно и то же, и %foo_hash0000->{"apple"} и %foo_hash0000{"apple"} не одно и то же?
Вот пример кода:
my @foo_ar0000 = ("camel", 23, 1.23);
print ("\\@foo_ar0000[0]: ", @foo_ar0000[0], "
\\n");
print ("\\$foo_ar0000[0]: ", $foo_ar0000[0], "
\\n");
print ("\\@foo_ar0000->
- : ", @foo_ar0000->
- , "
\\n");
print ("\\$foo_ar0000->
- : ", $foo_ar0000->
- , "
\\n");
my %foo_hash0000 = ("apple", "red", "banana", "yellow");
print ("\\%foo_hash0000{\\"apple\\"}: ", %foo_hash0000->{"apple"}, "
\\n");
print ("\\%foo_hash0000->{\\"apple\\"}: ", %foo_hash0000{"apple"}, "
\\n");
(последняя сточка выдаёт ошибку)
2. Почему, когда я пытаюсь использовать примечание из мануала по перлу ("You can also extend an array by assigning
to an element that is off the end of the array."): присвоить, например, 2300 элементу что-либо, а затем распечать массив, то скрипт начинает "подвисать"; причём, начинает виснуть на разных значениях индексов: иногда - начиная с 10, иногда - с 23?
Например:
my @foo_ar0001 = ("camel", 23, 1.23, "metton_bar");
print ("\\@foo_ar0001: ", @foo_ar0001, "
\\n");
print ("\\@foo_ar0001*1: ", @foo_ar0001*1, "
\\n");
print ("\\$#foo_ar0001: ", $#foo_ar0001*1, "
\\n");
$#foo_ar0001 = 10;
print ("
\\$foo_ar0001[22] = 10;\\n");
print ("\\@foo_ar0001: ", @foo_ar0001, "
\\n");
print ("\\@foo_ar0001*1: ", @foo_ar0001*1, "
\\n");
print ("\\$#foo_ar0001: ", $#foo_ar0001*1, "
\\n");
$foo_ar0001[2300] = "13rd element";
print ("
\\$foo_ar0001[22] = 22;\\n");
print ("\\@foo_ar0001: ", @foo_ar0001, "
\\n");
print ("\\@foo_ar0001*1: ", @foo_ar0001*1, "
\\n");
print ("\\$#foo_ar0001: ", $#foo_ar0001*1, "
\\n");
- виснет, а если убрать 3-ю с конца строчку, то всё нормально...
3. Не понимаю вот этого отрывка из мануала:
If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash. This is pretty much useful only to find out whether Perl\'s internal hashing algorithm is performing poorly on your data set. For example, you stick 10,000 things in a hash, but evaluating %HASH in scalar context reveals "1/16", which means only one out of sixteen buckets has been touched, and presumably contains all 10,000 of your items. This isn\'t supposed to happen.
А именно, что такое bucket (не перевод, а именно ЧТО ЭТО), и что возвращает хэш в скалярном контексте?
И ещё: $#hash0000 возвращает -1. Что это за значение?
Заранее спасибо!