Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как это работает? Pathologically Eclectic Rubbish Lister 
V
    Опции темы
Leviafan
  Дата 30.3.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.2.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Респект всем, кто работает с Perl!
smile
Я только начал его изучать, и тут вдруг, появились первые вопросы... Может кто подскажет, что это за конструкция и как она вообще работает:
Код

sub x{print @_}
x<<x
 x
x

А вот ещё похожая:
Код

print << x1
         x1


Please HELP! smile
PM MAIL WWW ICQ   Вверх
sharq
Дата 30.3.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Leviafan,
Цитата(Leviafan @ 30.3.2006, 20:06 Найти цитируемый пост)
ожет кто подскажет, что это за конструкция и как она вообще работает:

Цитата(Leviafan @ 30.3.2006, 20:06 Найти цитируемый пост)
sub x{print @_}
x<<x
x
x


где ты это нашел? smile

попробуй проверить это perl-код, вот что тебе напишет:
Код

Can't find string terminator "x" anywhere before EOF at 1.pl line 2.


а во втором:
Код

Can't find string terminator "" anywhere before EOF at 1.pl line 1.


Так что не придумывай ничего, а читай документацию и программируй на perl!

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 30.3.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



smile По поводу первого, думаю ты имел ввиду следующее:
Код

sub x{print @_}
x <<x;
 x
x

В данном случае подпрограмме x передаётся один параметр строка "x", после чего подпрограмма выводит в STDOUT полученные параметры.
Но получишь предупреждение, о котором писал sharq, если конечно они у тебя включены.

Во втором коде скорее всего предполагалось нечто вроде:
Код

print <<x1;
x1

Выводит в STDOUT пустую строку. Тоже получишь предупреждение, если они у тебя включены.

Это сообщение отредактировал(а) korob2001 - 30.3.2006, 23:24


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Leviafan
Дата 31.3.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.2.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Нет! Всё не совсем так...
Ещё раз и подробнее: скопировать нужно всё включая последний перевод строки (вот он-то как раз играет очень важную роль, без него вы и видите сообщения об ошибке)
Код

sub x{print @_}
x<<x
  hi   x
x



Итак, если вы действительно сделали всё точно, на экране появится надпись " hi x".

Код

print <<x1
  temp   
x1



Здесь будет выведена строка " temp
" Заметьте превод строки!

Но на главный вопрос "почему это вообще работает, что значит <<" так и не ответили... HELP!!
smile smile smile smile smile smile smile smile smile smile smile smile smile smile

Может кто-нибудь знает наверняка?
Добавлено @ 13:53
Примечание: в коде нигде не встречается ;
PM MAIL WWW ICQ   Вверх
sharq
Дата 31.3.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Leviafan, а так тебе понятно?

Код

sub my_print { print @_ }

my_print <<START;
    Hello
START



Точки с запятыми можешь поставить в описание функции, после первого START можешь убрать.

Цитата(Leviafan @ 31.3.2006, 14:51 Найти цитируемый пост)
Но на главный вопрос "почему это вообще работает, что значит <<" так и не ответили... HELP!!

C помощью << и ключевого слова можно выводить текстовый блок, причем блок должен заканчиваться тем же словом и после него перевод строки!

Если тебе будет спокойней, то используй такой вывод
Код

my_print qq~
    вадл
    ва
        к
        
    Hello
~;


smile
Добавлено @ 14:55
Здесь my_print - вызов твоей функции и передача ей в качестве первого параметра текст заключенный между ключевыми строками, т.е. обыкновенную строку с форматированием.
Если хочешь можешь передать несколько параметров:

Код

sub my_print { print join "\n====\n", @_ }

my_print <<START
    вадл
    ва
        к
        
    Hello
START
,
<<END
    bYE!!!
    END
END



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Kiber_rat
Дата 31.3.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Да, это от души smile Похоже что Leviafan нашел это среди каких-то perl приколов... Вот как следующий код, к примеру:
Код
#!/usr/bin/perl
@_='529593941075888994827992105879928610827577857992'=~/../g;for(0..$#_){printf"%c",--$_[$[+$_]+$#_}
;)


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
nitr
Дата 31.3.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Leviafan, что тебе сказать smile ? Прочти хоть одну книгу по перлу... надеюсь поможет и внимательно смотри пример sharq'а
my_print <<START
Hello
START

можно и так записать
my_print q%
Hello
%

Ещё очень удобно для ХРАНЕНИЯ ТЕКСТА внутри программы
Код

#!/usr/bin/perl
...... #код программы

__DATA__
....

Смотри примеры в книжках smile . "библия" и CookBook тебе в помощь!


--------------------
PM   Вверх
korob2001
Дата 31.3.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата(sharq @ 31.3.2006, 11:51 Найти цитируемый пост)
C помощью << и ключевого слова можно выводить текстовый блок, причем блок должен заканчиваться тем же словом и после него перевод строки!

А называется это "документ тута". smile



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
nitr
Дата 31.3.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



короче perldoc perldata (з.ы.: надеюсь английский знаешь ;) )


--------------------
PM   Вверх
Leviafan
Дата 1.4.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.2.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Всем спасибо... я разобрался... вот ИМХО по этим примерам:
Код

# Опреатор << включает режим хранения в скалярной переменной многострочных
# записей, после него должен обязательно указываться признак конца многострочной
# записи (ПКМЗ)
$x = << "END";
    My stuff goes here
END
print $x; # Выведет на экран строку "    My stuff goes here\n"

# Немного модифицируем данный нам случай:
# print << "off" x5
#    hello \n   x5
#    temp

# off

# Этот блок равносилен следующей записи:
# print "   hello \n   x5\n   temp\n\n" x 5;
# На STDOUT будет выведено 5 указанных строчек!

# Вывод: смысл первой строчки в том,что print должен вывести многострочную
# запись, указанную в теле программы до off, нужное количество раз (в нашем
# случае 5) Т.е. в первой и только в первой строке могут ещё указываться
# дополнительные параметры работы с многострочными записями

# Чисто в нашем случае признак конца многострочной записи указан не был,
# следовательно использовалось значение по умолчанию - пустая строка поэтому
# корректной записью будем считать следующую:
print << x1
    =)   x1


# Конец блока после двух переводов строки (первый - ПКМЗ, второй обязателен!
# для работы с МЗ)
# Запись равносильна следующей:
# print "    =)   x1\n" x 1;


Код

sub x{print @_}
x<<x
 x
x
# Вызов подпрогаммы x печатающей на экран список своих параметров.
# В качестве параметров функция получает многострочную запись с x
# в качестве ПКМЗ. Причём второй x не является ПКМЗ, т.к. в МЗ должна
# присутствовать хотя бы одна обычная строка.
# Строчки в блоке с 1 по 3 эквивалентны записи x " x\n";


А вот теперь следующий вопрос: даже разобравшись во всём этом я немного в высаде от вот этого примера:
Код

($_ = <<'  x') =~ s/^\s+//gm;
($_ = <<'x') =~ s/^\s+//gm;
  x


А, значит, я чего-то недопонял... Объясните, если не трудно...
Добавлено @ 20:41
И вот ещё что: чем отличаются следующие обращения?
Код

$a = [];
$a  vs  [@$a]

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

Кстати, nitr, по поводу книг: меня всегда учили, что книги - второе, чему обращается настоящий программист при изучении нового языка... вначале он исследует новую "территорию"... Я не прав??
PM MAIL WWW ICQ   Вверх
nitr
Дата 1.4.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



=) ты неправ для тебя ;)


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.