Имя:    Пароль:      Помнить меня       
Unsorted   ~  Software  ~  Development and Design  ~  Помощь по Perl
На страницу 1, 2  »
inkognit
Сообщение  14 Ноя 2009, 15:24  Ссылка : Ответить с цитатой
Возраст: 34 Пол: Мужской 
C нами с 30.04.2006
Репутация: 77.5

Помощь по Perl и иже с ним.

Ребята, никак не могу разобраться с областью видимости.

Дело стоит так.
Есть 2 файла - string.pl и lang.pl

string.pl:
#!/usr/bin/perl

require 'lang.pl';

our $DEBUG = 0;

# my string functions

our sub println {
	print shift()."\n";
}

sub empty {
	return 1 if ($_[0] eq '') || ($_[0] == 0);
        return 0;
}

sub err {
	return lang('Internal error!') if empty $DEBUG;
	return shift;
}


println err lang('Booooo!');


lang.pl
#!/usr/bin/perl

our %lang;
$lang{'Internal  error!'} = 'Internal error!';

our sub lang {
	return $_[0];
}

1;


Так вот, вышенаписанный код работает хорошо. Однако если опускать скобки при функции lang() - интерпретатор жалуется, что функция еще не определена.
Подскажите, что я делаю неправильно? Есть ведь у нас perl-программисты, да?


Последний раз редактировалось: inkognit (16 Ноя 2009, 23:52), всего редактировалось 1 раз

_____________________________
Дайте в руки мне баян, я порву его совсем.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : E-mail
NarWhal
Сообщение  16 Ноя 2009, 13:27  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 03.03.2006
Репутация: 100.4

Цитирую:
use strict; 

sub hello_string; 

print hello_string; 
	 
# some other code here.... 
	 
sub hello_string { 
   return "Hello, World!\n"; 
}

When we access the hello_string subroutine in the above example without using parentheses (and without the older style & notation), we are calling the subroutine as a list operator, which may change the precedence of the subroutine call in relation to other operators that exist within the same command. In order to use a subroutine as a list operator as in the above example, the subroutine must have already been declared, which is what we accomplished with the sub hello_string code above. This statement is called a forward declaration; and is rarely needed (for standard user defined subroutines that are called using parentheses, and, as we'll discuss later, forward declarations are unnecessary) unless you want to create and call your user-defined subroutines in the same manner as the built-in Perl list operators, such as print or shift. Still, it's there when you need it.

Источник.

Грубо говоря, необходима явная предварительная декларация для использования подобного стиля ( когда отсутствуют круглые скобки и предлагается интерпретатору воспринимать функцию как оператор списка ). Иначе, при проверке синтаксиса ( а значит, и до выполнения require ) perl интерпретирует подобную конструкцию как неизвестную строку вместо оператора.

Я, конечно, понимаю желание получить красивый код, но...
1) use strict; — правило хорошего тона;
2) дублирование одноименных идентификаторов для хэш-переменной и функции возможно и ошибку не вызовет, но смотрится странно, запутывает и не читается;
3) лучше использовать нормально оформленные модули/библиотеки.

Улыбочка
В начало
Профиль : Фотоальбом : Личное Сообщение
Вовчик
Сообщение  16 Ноя 2009, 14:00  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 23.07.2006
Репутация: 56.4

Есть сайт написанный на Perl, может кто на возмездной основе оказывать поддержку сайту и вносить периодически изменения на страницах?
В начало
Профиль : Личное Сообщение
smeks
Сообщение  16 Ноя 2009, 14:49  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 17.09.2009
Репутация: 13

а чё такое вообще пёрл помогите а
В начало
Профиль : Фотоальбом : Личное Сообщение : ICQ
Вовчик
Сообщение  16 Ноя 2009, 15:19  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 23.07.2006
Репутация: 56.4

smeks, язык программирования.
В начало
Профиль : Личное Сообщение
smeks
Сообщение  16 Ноя 2009, 15:20  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 17.09.2009
Репутация: 13

как хтмл?
В начало
Профиль : Фотоальбом : Личное Сообщение : ICQ
Вовчик
Сообщение  16 Ноя 2009, 15:21  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 23.07.2006
Репутация: 56.4

smeks, как С++.
В начало
Профиль : Личное Сообщение
smeks
Сообщение  16 Ноя 2009, 15:22  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 17.09.2009
Репутация: 13

ну а научить сможеш

Добавлено спустя 1 минуту 39 секунд:

Я в шоке
В начало
Профиль : Фотоальбом : Личное Сообщение : ICQ
Вовчик
Сообщение  16 Ноя 2009, 15:38  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 23.07.2006
Репутация: 56.4

smeks, как видишь я сам прошу помощи, если б я разбирался - подсказал бы...
В начало
Профиль : Личное Сообщение
smeks
Сообщение  16 Ноя 2009, 15:45  Ссылка : Ответить с цитатой
Пол: Мужской 
C нами с 17.09.2009
Репутация: 13

ну а перл легче хтмл а
В начало
Профиль : Фотоальбом : Личное Сообщение : ICQ
NarWhal
Сообщение  16 Ноя 2009, 15:46  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 03.03.2006
Репутация: 100.4

smeks, в интернете полно учебников, справочной информации. И уж тем более там можно найти ответ на вопрос: "Что такое perl."

Давайте не будем засорять данную ветку. Тут люди свои конкретные вопросы по языку задают.
В начало
Профиль : Фотоальбом : Личное Сообщение
inkognit
Сообщение  16 Ноя 2009, 21:57  Ссылка : Ответить с цитатой
Возраст: 34 Пол: Мужской 
C нами с 30.04.2006
Репутация: 77.5

NarWhal, большое спасибо! Вы единственный дали четкий и понятный ответ.
Про необходимость предекларации знал, но очень надеялся на то, что есть более простой способ, позволяющий дать понять перлу, что это функция.
Подумаю над использованием Package. Может он поможет.
Но вам все равно вручу плюсик, за поддержку и внимание (знали бы чего я наслушался на всяких "форумах программистов" за последние сутки!).

smeks, html - это не язык программирования. Это язык разметки. То бишь используется он не для написания алгоритмов, а для описания преобразований текста. Разумеется, html легче perl'a.
Если хотите что-либо изучить, читайте соответствующую литературу. Рекомендую www.intuit.ru - на первых порах сойдет.

Вовчик, а можно ознакомиться с исходными кодами (исключительно в образовательных целях)?

_____________________________
Дайте в руки мне баян, я порву его совсем.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : E-mail
Silicoid
Сообщение  16 Ноя 2009, 22:03  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 28.07.2005
Репутация: 135.1

Господа. такой вопрос, а чем перл, собсно, лучше php
это не холливар, мне просто интересно?!
В начало
Профиль : Блог : Личное Сообщение : Сайт : ICQ
inkognit
Сообщение  16 Ноя 2009, 23:00  Ссылка : Ответить с цитатой
Возраст: 34 Пол: Мужской 
C нами с 30.04.2006
Репутация: 77.5

Silicoid, ну, я вообще только начал учить его, но в принципе могу уже выделить кое-какие плюсы.

Во-первых, он заточен на работу с текстом в принципе, а не только на веб-разработку.
Во-вторых, регулярные выражения и отчеты произвели на меня неизгладимое впечатление. Подобной гибкости в PHP нельзя добиться в принципе.
В-третьих, там более там более продуманы алгоритмы доступа к переменным - совмещет прототу PHP и в то же время позволяет оперировать ссылками, в том числе и на функции, что есть несомненно круто - именно этого мне очень не хватало при переходе с плюсов на PHP.
В-четвертых, очень приятный синтаксис, с возможностью инверсии выражений и опускания скобок. Чего стоит один...
print "true\n" if $var == 1;


Еще ходят слухи, что он несколько быстрее того же PHP, но тут уж не в курсе.

—-

Кстати, я походу нашел решение моей проблемы. Выкладываю сюда, на случай если кому понадобится.
Чтобы при вынесении функций в файл не ставить скобки и разыменовывающий функции префикс '&' можно вынести функции в модуль и использовать стандартный модуль Exporter.
Пример:

test.pl
#!/usr/bin/perl

use strict;
use Include;

hello;
hello2;


Include.pm
#!/usr/bin/perl

package Include;

BEGIN {
	use Exporter ();
	@ISA = "Exporter";
	@EXPORT = ("&hello", "&hello2");
}

sub hello {
	print "Hello, world!\n";
}

sub hello2 {
	print "Hello, world #2 !!!\n";
}

return 1;


Результат работы:
chebog@notebook:~/Рабочий стол/perl/test$ ./test.pl
Hello, world!
Hello, world #2 !!!
chebog@notebook:~/Рабочий стол/perl/test$

_____________________________
Дайте в руки мне баян, я порву его совсем.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : E-mail
NarWhal
Сообщение  16 Ноя 2009, 23:12  Ссылка : Ответить с цитатой
Возраст: 45 Пол: Мужской 
C нами с 03.03.2006
Репутация: 100.4

Silicoid писал(а):
Господа. такой вопрос, а чем перл, собсно, лучше php
это не холливар, мне просто интересно?!
Писал на очень многих языках. Начиная от Asm'a, проходя через всякие виды ущербных и не очень Бейсиков и Паскалей, освоив математически заточенный и узкий Фортран и такого тяжеловеса как С. Наш прогрессивный век заставил близко познакомиться с SQL, по долгу службы с Perl, а для общего развития тут еще и PHP где-то рядом. Но! Не могу сказать, что всё перечисленное освоено мной до уровня профессиональных знаний. Что-то в своё время знал от А до Я ( как Asm ), что-то не так глубоко. Вот и теперь не могу сказать, что знаю PHP так же хорошо как Perl. К тому же и последний я не знаю на все 100%, потому как он очень и очень богат по своим возможностям, которые либо надо усердно впитывать в обучении, либо накапливать годами опыта.

Зачем я всё это писал? Просто для того чтобы сказать, что не могу объективно сравнить Perl vs PHP. Однако, приведу ссылку на неплохую (хоть и далеко не полную) сравнительную статью, которую можно получить по простому запросу в qooqle. Улыбочка

От себя могу коротко сказать, что у языков немного разные области приложения. Perl более низкоуровневый, что ли. И он намного более сложный. Чтобы использовать его эффективно, нужно хорошо знать автоматизируемый процесс. К тому же, более лаконичного и гибкого по синтаксису языка я не встречал. Изначально Perl был во многом "заточен" на работу с текстом, а потому имеет самый мощный функционал для работы со строками, позволяя сделать в одну строку то, что в других языках потребует десяток строк кода.

В общем, каждой задаче — своё.

inkognit, ну вот, хорошее решение найдено. Улыбочка И, ещё один примерчик лаконичности к Вашему с инверсией (тоже просто наслаждаюсь такими возможностями языка):
$value = defined $external_value ? $external_value : $default_value;
Язык
В начало
Профиль : Фотоальбом : Личное Сообщение
Показать сообщения:   
На страницу 1, 2  »

Unsorted   ~  Software  ~  Development and Design  ~  Помощь по Perl

Ответить на тему

Перейти:  





Powered by phpBB   © Unsorted Team  support@unsorted.me  promo@unsorted.me  Полезные скрипты