LINUX.ORG.RU

Вопрос по синтаксису perl

 


0

2

Я не понимаю, зачем в перл используются $ в начале переменых? В других языках, таких как sh, tcl, эти знаки имеют определенно семантическое значение. Мы a=1 либо получаем имя переменной a, либо значение $a. А в Перле это для красоты чтоли?

Приведение типов, уточнение поиска по namespace

Не нравится - пиши свой язык. Может быть им даже будут пользоваться полтора человека

router ★★★★★
()

$calar
@rray
Ларри же лингвист, прикололся.

Virtuos86 ★★★★★
()

В основном для различия типов переменных:

$ - скаляр
@ - массив
% - хеш
& - функция
* - typeglob

Ну и как побочный эффект возможность интерполяции переменных внутри строки:

print "Value of \$a = $a";

Olegymous ★★★
()
Последнее исправление: Olegymous (всего исправлений: 3)
Ответ на: комментарий от Olegymous

В основном для различия типов переменных:

В других динамических языках как-то без этого обходятся.

Ну и как побочный эффект возможность интерполяции переменных внутри строки:

Мне кажется, или интерполяция переменных и сигилы для разных типов переменых — это немного несвязанные между собой понятия?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

В других динамических языках как-то без этого обходятся.

Конечно, я предполагаю, что сигилы могут использоваться для примитивных статических проверок и оптимизаций в некоторых реализациях Perl.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Фактически, это означает, что Perl — частично статически типизированный ЯП с явной типизацией, LOL, а некоторые еще распинаются о его неимоверной динамичности.

terminator-101
() автор топика
Ответ на: комментарий от theNamelessOne

В других динамических языках как-то без этого обходятся.

+1

Строгая типизация для людей со слабой памятью.

ziemin ★★
()
Ответ на: комментарий от theNamelessOne

В других динамических языках как-то без этого обходятся.

А в этих языках могут одновременно существовать массив foo и хеш foo? В Perl могут.

Мне кажется, или интерполяция переменных и сигилы для разных типов переменых — это немного несвязанные между собой понятия?

Небыло бы сигилов для интерполяции пришлось бы городить костыли, как во всяких ruby и python.

Olegymous ★★★
()
Ответ на: комментарий от ziemin

Строгая типизация

А, кста, что обычно подразумевают под строгой? статическую, явную? без приведения типов? Или все вместе?

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Фактически, это означает, что Perl — частично статически типизированный ЯП с явной типизацией,

На самом деле я бы не торопился это утверждать.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Olegymous

А в этих языках могут одновременно существовать массив foo и хеш foo? В Perl могут.

А в чём профит?

Небыло бы сигилов для интерполяции пришлось бы городить костыли, как во всяких ruby и python.

Примеры костылей привести сможешь? Тем более, что в Python нет строковой интерполяции как таковой.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Olegymous

Небыло бы сигилов для интерполяции пришлось бы городить костыли, как во всяких ruby и python.

Мне кажется, именно для Perl, это справедливо, в языках типа sh, интерполяция происходит «естественным» путем. Просто внутри определенных кавычек интерпретатор вычисляет значение переменных, или не вычисляет, как обычною а в перле, хз, там как то по-другому.

terminator-101
() автор топика
Ответ на: комментарий от theNamelessOne

А в чём профит?

Как самое очевидное любая переменная не будет конфликтовать со встроенными в язык ключевыми словами. Ну и что-то такое бывает удобно делать

for my $kw (@kw) {
   ...
}

Примеры костылей привести сможешь? Тем более, что в Python нет строковой интерполяции как таковой.

"the value of foobar is #{foobar}"
"the value of foobar is %s" % foobar
Olegymous ★★★
()
Ответ на: комментарий от Olegymous

Небыло бы сигилов для интерполяции пришлось бы городить костыли

Короче подумал сейчас, там пошли бы любые символы, например как лисповские quote unquote, непосредственного отношения к интерполяции это не имеет, просто удобней было так запилить, раз уж они все равно есть. Основное назначение, правильно, явное указание типов переменных.

terminator-101
() автор топика

ну типа задаёт контекст
@array — списковый контекст — возвращает список элементов
$array — скалярный контекст — возвращает количество элементов(если правильно помню)

$a = (1,2,3)
a=3
@a = (1,2,3)
a=(1,2,3)

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Да это понятно, но динамически типизированные языки обычно обходятся без этого. Тип переменной выясняется по его значению, как-бы. А это типа, для явной типизации сделано, видимо, вместо нее, или как сказать хз.

terminator-101
() автор топика
Ответ на: комментарий от Olegymous

Как самое очевидное любая переменная не будет конфликтовать со встроенными в язык ключевыми словами.

Мне ни разу не приходилось в Ruby использовать переменные, которые называются так же, как и ключевые слова.

Ну и что-то такое бывает удобно делать

Ну...

[1] pry(main)> ary = 1..5
=> 1..5
[2] pry(main)> ary.each { |ary| p ary }
1
2
3
4
5
=> 1..5
[3] pry(main)> 

Насчёт костылей: не увидел костылей в примере с Ruby (у Python, как я повторю, нет интерполяции, как я считаю).

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 3)
Ответ на: комментарий от Bad_ptr

ещё в перле чтобы подсчитать выражение (например не $var експанднуть, а $var+1) прямо в строке надо писать так:

«stroka: @{[$var + 1]}»

И ещё куча костылей

Bad_ptr ★★★★★
()

Я не понимаю, зачем в перл используются $ в начале переменых?

Программирование не твое, смирись.

iVS ★★★★★
()
Ответ на: комментарий от theNamelessOne

так ничем не лучше
столько символов затем, что тут создаётся ссылка на анонимный массив с одним элементом и она потом разыменовывается и экспандится как список

Bad_ptr ★★★★★
()
Ответ на: комментарий от terminator-101

Фактически, это означает, что Perl — частично статически типизированный ЯП с явной типизацией, LOL

Фактически это означает, что ты - школьник, пытающийся рассуждать о том, в чём совершенно не разбирается. Безапелляционные «выводы» это лучше всего подчёркивают

router ★★★★★
()
Ответ на: комментарий от iVS

ТС его изучает.

С чего ты взял? Если я интересуюсь синтаксисом языка, я обязательно его должен изучать? Я, в данном случае, интересуюсь в контексте реализации.

Ну, и да, мы же не услышали твоего, авторитетного мнения по данному вопросу. Может ты не знаешь?

terminator-101
() автор топика
Ответ на: комментарий от Bad_ptr

Я может туплю, но зачем здесь ссылка на анонимный массив? Разве Perl при интерполяции не может вычислять произвольные выражения?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

ну на сколько я помню, только так это и можно сделать

Bad_ptr ★★★★★
()
Ответ на: комментарий от theNamelessOne

Разве Perl при интерполяции не может вычислять произвольные выражения?

λ desktop ~ → perl
$x = 1;
print "${x + 1}"
λ desktop ~ → perl
$x = 1;
print "${$x + 1}"
λ desktop ~ → perl
$x = 1;
print "@{[$x + 1]}"
2%

Лол, и Olegymous ещё что-то говорил про костыли при строковой интерполяции…

theNamelessOne ★★★★★
()
Ответ на: комментарий от iVS

Предположу, что ТС интересовался не тем, какую роль играют сигилы в Perl, а причиной того, зачем они вообще были введены в язык.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

интерполяция переменных

Это не всегда интерполяция переменных. Можно одновременно создать 2 переменных $name ( скаляр ) и @name, массив. $ и @ будут уточнять поиск по namespace

В других динамических языках как-то без этого обходятся.

В других динамических языках ( python ? ) почти всё - объект. Если в Perl использовать _только_ объекты, то обращение будет унифицированное, через $object и методы $object. Но ООП реализовано нестандартно, вызов методов сравнительно дорогой по времени, т.к. все методы - динамические. И переписывать хеш и массив в виде мягко говоря будет неоправдано

router ★★★★★
()
Ответ на: комментарий от router

Это не всегда интерполяция переменных. Можно одновременно создать 2 переменных $name ( скаляр ) и @name, массив. $ и @ будут уточнять поиск по namespace

Это имеет смысл, другое дело, что обычно без «можно одновременно создать 2 переменных» можно спокойно обойтись.

В других динамических языках ( python ? ) почти всё - объект.

В Perl скаляры, массивы и хеши — unboxed?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

В Perl скаляры, массивы и хеши — unboxed?

Не знаю, что такое unboxed. Не объкты. Не имеют методов, операции над ними входят в синтаксис самого языка

Скаляр может быть строкой, либо ссылкой на что либо, в т.ч. на объект. В этом случае можно обращаться к его методам

Я мало использовал ООП в Perl, поэтому в данной теме буду плавать. Для меня Perl - bash на стероидах, более высокоуровневый, без необходимости порождать внешние процессы при типовых действиях ( grep, cat )

router ★★★★★
()
Ответ на: комментарий от theNamelessOne

В Perl скаляры, массивы и хеши — unboxed?

Хотя мне кажется, что я спорол чушь, и в Perl объекты — это просто другие сущности, отличные от скаляров и массивов?

theNamelessOne ★★★★★
()
Ответ на: комментарий от router

Не знаю, что такое unboxed. Не объкты. Не имеют методов, операции над ними входят в синтаксис самого языка

Я уже сам догадался :)

theNamelessOne ★★★★★
()
Ответ на: комментарий от router

В других динамических языках ( python ? ) почти всё - объект. Если в Perl использовать _только_ объекты, то обращение будет унифицированное, через $object и методы $object. Но ООП реализовано нестандартно, вызов методов сравнительно дорогой по времени, т.к. все методы - динамические. И переписывать хеш и массив в виде мягко говоря будет неоправдано

ты феерическую чушь несешь. Для исполнителя в тексте проги нет никаких «объектов», объекты на уровне юзер-интерфейса. Исполнитель смотрит на голые символы. В случае «тех» языков происходит примерно следующее

(define eval (expression environment)
   (condition
      ((atom? expression) 
        (if (self-evaluate? expression)
           expression
           (lookup expression environment)))
                ...
            ))

То есть, сначала выясняется, является ли выражение строкой или числом, если нет, значит переменная, соответственно ищется значение. В случае же перла, сразу по идентификатору можно определить, что это переменная (и тип переменной), т.е. Экономим 1-2 шага вычислений, засчет работы программиста. То же самое, что и с явным указанием типа, короче. Это упрощенно, но суть такова.

terminator-101
() автор топика
Ответ на: комментарий от router

без необходимости порождать внешние процессы при типовых действиях ( grep, cat )

В смысле, что в Perl встроена функциональность, аналогичная grep и cat?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Хотя мне кажется, что я спорол чушь, и в Perl объекты — это просто другие сущности, отличные от скаляров и массивов?

Хуже. Это надстройка над скаляром, хэшем и областью видимости.

Скаляр, в котором содержится ссылка специальным образом оформленный хэш. При этом можно обращаться к полям. И чёрной магией через область видимости сюда же пришиты методы, хотя в явном виде их в хэше нет.

router ★★★★★
()
Ответ на: комментарий от theNamelessOne

В смысле, что в Perl встроена функциональность, аналогичная grep и cat?

Как и в любом другом более-менее современном языке

router ★★★★★
()
Ответ на: комментарий от Olegymous

Интерполяция выражений, на мой взгляд, вещь ненужная.

Как скажешь. Так в чём заключается костыльность интерполяции строк в Ruby?

theNamelessOne ★★★★★
()

Кстати благодаря сигилам perl может найти явные ошибки программиста ещё на этапе компиляции. То, что в Python и Ruby свалится в рантайме, в Perl просто не запустится

use strict;

my @array = (1,3,4,5);
print $array+1;

Olegymous ★★★
()
Ответ на: комментарий от theNamelessOne

Тем, что пришлось вводить дополнительную конструкцию #{}, очевидно :) Соглашусь, что с этим вполне можно жить.

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

Тем, что пришлось вводить дополнительную конструкцию #{}, очевидно

В Perl как минимум две таких конструкции: "$foo" и "@foo".

theNamelessOne ★★★★★
()
Ответ на: комментарий от Olegymous

ошибки программиста ещё на этапе компиляции

function foo(){foo foo} // error

Падает, хотя ф-цию никто не запускал Ошибки всегда можно найти явные, вопрос только в стоимости этой проверки

Но да, perl можно считать, языком с явной типизацией. Только т-ссс... Никому.

terminator-101
() автор топика
Ответ на: комментарий от Olegymous

То, что в Python и Ruby свалится в рантайме, в Perl просто не запустится

Есть много других интересных ошибок рантайма, как правило связанных с разыменованием указателей.

router ★★★★★
()

знак перед именем определяет тип слота в таблице символов, а само имя символа может ссылаться на несколько разных типов. Например дамп таблицы символов главного модуля можно вывести командой

perl -MData::Dumper -e'print Dumper \%::'
chg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.