|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 05 Apr 2002 21:01:51 To : Artem Chuprina Subject : Re: Просьба -------------------------------------------------------------------------------- e.ru> <a8k7mv$1am3$1@ddt.demos.su> <slrnaardod.l5n.ran@banquet.lan.ice.ru> e.ru> <a8kfst$2k15$1@ddt.demos.su> <slrnaarij3.l5n.ran@banquet.lan.ice.ru> From: Andrey Sapozhnikov <sapa@icb.chel.su> Artem Chuprina wrote: > Здравствуй, Igor Gerdler. > > IG> > В данном случае гвоздями в код забито. Она встроенная. В случае > IG> > пользовательской функции - по прототипу. > > IG> Приведу два примера. > > IG> Пример 1. > IG> sub func { > IG> @_[0] = 'ya'; > IG> return; > IG> } > > sub func (\$) > > Кстати, "Scalar value @_[0] better written as $_[0]". > > IG> Пример 2. > IG> sub func { > IG> my $var1 = shift; > IG> print $var1; > IG> return; > IG> } > > sub func ($) > > IG> Если не сложно, Артем, напиши два прототипа, по которым интерпритатор > IG> определить, что в первой функции параметр должен быть lvalue, а во втором > IG> - нет. > > Плиз. Правда, если ты имел в виду в первой функции поменять значение, это надо > делать иначе. Внутри интерпретатора Perl случилась определенная путаница. В большей части в этом виноваты хитрости работы со списками и массивами. В основном правила lvalue списочного типа есть массив lvalue скалярного типа есть скаляр выполняются. Однако появляется ряд исключений. Hапример слайсы есть lvalue списочного типа, но не массив. @hash{qw(one two three)} = 1..3; @array[1..3] = 1..3; Lvalue-списки тоже: ($first, $second, @rest) = 1..100; Их контроль прототипов не пропустит. Hи слайс, ни список не являются объектами, они являются только значениями. Попытка взять ссылку на список документирована и приводит к получению списка ссылок на его элементы. Веселее с попыткой взять ссылку от слайса. my @a = (1, 2, 3, 4, 5, 6); my $ref = \@a[2,3]; попробуйте угадать, что теперь содержит $ref :) Для хэша все несколько проще, по причине того, что у данных объектов отсутствует свой тип данных, т.е. значение. lvalue хэши имеют списковый тип. Скалярные lvalue которые не скаляры тоже есть. Hапример функция substr. Можно сделать: substr($line,0,3) = '[censored]'; но передать в функцию с прототипом \$ этот substr не удастся. Hо в общем-то правило, хоть и с исключениями прослеживается. Так например элемент массива, является lvalue: $a[5] = 5; и может быть передан в функцию с прототипом \$, поскольку ссылка на элемент массива может быть взята и является нормальной ссылкой на скаляр. Hаиболее обобщенным правилом можно считать такое, если объект есть lvalue и от него можно взять ссылку соответствующего типа, то он может быть передан в прототипированную функцию как аргумент. Из этого правила сильно выбивалось условное выражение ?: которое я уже запатчил, и может его примут. Хотя есть и еще исключения, а что поделать, в наших родных языках их тоже полно, это только делает нашу речь богаче :) Да, для желающих, пример несоблюдения первого условия из "обобщенного правила": Объект 'aaaa' (литерал). Скалярную ссылку от него взять можно, но он не lvalue. Попытка передать 'aaaa' в качестве параметра в функцию с прототипом \$ будет неуспешной. Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/528475289156.html, оценка из 5, голосов 10
|