Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > open 0


Автор: chaos 31.3.2010, 08:48
объясните пожалуйста принцип работы программы

Код
#!/usr/bin/perl -w

open 0;
print <0>;


интересуют последние 2 строчки smile как так вообще получается что на экран выводится этот же текст  smile 

Заранее благодарен!

Автор: Egik2 31.3.2010, 10:24
Да, классный скрипт.

Как я понимаю, так:
0 - файловый дескриптор STDIN процесса perl. 

командой open 0, мы открываем его еще раз
print <0>; - печатаем его содержимое.

То есть то что получается вполне логично, печатаем, то что получаем на вводе  smile 
Думаю данную штуку можно сделать на любом языке

Автор: shamber 31.3.2010, 10:52
Egik2, ага соревнования есть, кто короче напишет smile

Автор: chaos 31.3.2010, 10:53
Egik2, не совсем вкурил. те что Вы написали я это сам понял. но вот про 0 и как там появился текст программы не понял %)

PS мож кто перлдоком кинет по конкретной проблемЕ ? smile

Автор: Pfailed 31.3.2010, 12:35
perldoc open:
Цитата

open FILEHANDLE,EXPR

If EXPR is omitted, the scalar variable of the same name as the FILEHANDLE contains the filename.


Как раз наш случай. Соответственно в качестве имени файла берется переменная $0. А переменная $0 содержит имя файла содержащего данную программу. Соответственно открывается для чтения сам исходник скрипта, считывается в списочном контексте (а значит целиком) и распечатывается.

Автор: chaos 31.3.2010, 15:08
Цитата(Pfailed @ 31.3.2010,  09:35)
perldoc open:
Цитата

open FILEHANDLE,EXPR

If EXPR is omitted, the scalar variable of the same name as the FILEHANDLE contains the filename.


Как раз наш случай. Соответственно в качестве имени файла берется переменная $0. А переменная $0 содержит имя файла содержащего данную программу. Соответственно открывается для чтения сам исходник скрипта, считывается в списочном контексте (а значит целиком) и распечатывается.

ок. исходя из Ваших суждений код
Код

#!/usr/bin/perl

open F;
print <F>;


должен сработать, но увы. Пчоему? Или я где-то ошибся?

Автор: shamber 31.3.2010, 15:26
Какое отношение 
Цитата(chaos @  31.3.2010,  15:08 Найти цитируемый пост)
F

имеет к $0?

Автор: arto 31.3.2010, 15:55
# cat > aaa
# perl -e '$a = "aaa"; open a; print <a>;'
aa
bb
cc
# 

Автор: amg 31.3.2010, 16:02
chaos,  чтобы было понятнее, вот так попробуйте smile
Код
#!/usr/bin/perl
$F = $0;
open F;
print <F>;


ЗЫ Это, наверное, нечестный квин, т.к. используются особые свойства одной из переменных.

Автор: ginnie 31.3.2010, 16:04
arto, не понял Ваш пример, не поясните?

Автор: arto 31.3.2010, 16:06
забыл добавить, что:

# cat > aaa
aaa
bbb
ccc
^D
#

Автор: ginnie 31.3.2010, 16:08
А выводится
Цитата

aa
bb
cc


 smile 

Автор: arto 31.3.2010, 16:16
угу, сам опешил.

Автор: ginnie 31.3.2010, 16:19
А почему у меня не так?

Код

[ginnie@office ~]$ cat > aaa
aaa
bbb
ccc
[ginnie@office ~]$ perl -e '$a = "aaa"; open a; print <a>;'
aaa
bbb
ccc
[ginnie@office ~]$

 smile 

Автор: arto 31.3.2010, 19:58
# perl -V:mo
mo='yesssss!';
#

Автор: krypt3r 1.4.2010, 09:09
С перл-манков
Цитата

Obfuscorner

If you only send a filehandle to open(), Perl will look for a package variable (not a lexical) of the same name, and use the value of that variable as the filename to open. A simple use of this is to open the program itself; since $0 holds the name of the program, you can simply write:
Код

open 0;  # like:  open 0, $0


Прикольная вещь =) Но с прагмой strict она не дружит. Точнее, open 0; print <0>; работает, а с переменными так уже не получится

Автор: arto 1.4.2010, 09:18
# perl -Mstrict -Wc -e 'my $A = "aaa"; open A; print <A>'
-e syntax OK
#

Автор: Pfailed 1.4.2010, 10:00
Если объявить переменную как our, то сработает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)