|
|
Возраст: 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 раз
_____________________________ Дайте в руки мне баян, я порву его совсем.
|
|
|
|
|
|
|
Возраст: 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) лучше использовать нормально оформленные модули/библиотеки.
|
|
|
|
|
|
|
|
C нами с 23.07.2006 Репутация: 56.4
|
|
Есть сайт написанный на Perl, может кто на возмездной основе оказывать поддержку сайту и вносить периодически изменения на страницах?
|
|
|
|
|
|
|
|
C нами с 17.09.2009 Репутация: 13
|
|
а чё такое вообще пёрл помогите а
|
|
|
|
|
|
|
|
C нами с 23.07.2006 Репутация: 56.4
|
|
smeks, язык программирования.
|
|
|
|
|
|
|
|
C нами с 17.09.2009 Репутация: 13
|
|
|
|
|
|
|
|
C нами с 23.07.2006 Репутация: 56.4
|
|
|
|
|
|
|
|
C нами с 17.09.2009 Репутация: 13
|
|
ну а научить сможеш
Добавлено спустя 1 минуту 39 секунд:
|
|
|
|
|
|
|
|
C нами с 23.07.2006 Репутация: 56.4
|
|
smeks, как видишь я сам прошу помощи, если б я разбирался - подсказал бы...
|
|
|
|
|
|
|
|
C нами с 17.09.2009 Репутация: 13
|
|
|
|
|
|
|
|
Возраст: 45 C нами с 03.03.2006 Репутация: 100.4
|
|
smeks, в интернете полно учебников, справочной информации. И уж тем более там можно найти ответ на вопрос: "Что такое perl."
Давайте не будем засорять данную ветку. Тут люди свои конкретные вопросы по языку задают.
|
|
|
|
|
|
|
|
Возраст: 34 C нами с 30.04.2006 Репутация: 77.5
|
|
NarWhal, большое спасибо! Вы единственный дали четкий и понятный ответ.
Про необходимость предекларации знал, но очень надеялся на то, что есть более простой способ, позволяющий дать понять перлу, что это функция.
Подумаю над использованием Package. Может он поможет.
Но вам все равно вручу плюсик, за поддержку и внимание (знали бы чего я наслушался на всяких "форумах программистов" за последние сутки!).
smeks, html - это не язык программирования. Это язык разметки. То бишь используется он не для написания алгоритмов, а для описания преобразований текста. Разумеется, html легче perl'a.
Если хотите что-либо изучить, читайте соответствующую литературу. Рекомендую www.intuit.ru - на первых порах сойдет.
Вовчик, а можно ознакомиться с исходными кодами (исключительно в образовательных целях)?
|
_____________________________ Дайте в руки мне баян, я порву его совсем.
|
|
|
|
|
|
|
Возраст: 45 C нами с 28.07.2005 Репутация: 135.1
|
|
Господа. такой вопрос, а чем перл, собсно, лучше php
это не холливар, мне просто интересно?!
|
|
|
|
|
|
|
|
Возраст: 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$ |
|
_____________________________ Дайте в руки мне баян, я порву его совсем.
|
|
|
|
|
|
|
Возраст: 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; |
|
|
|
|
|
|
|
|