|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Chernomyrdin 2:5020/400 17 Nov 2005 14:49:40 To : Alexey Bavykin Subject : Re: вопрос про STDOUT -------------------------------------------------------------------------------- Alexey Bavykin wrote: > Andrey Chernomyrdin @ Thu 17/11/05 12:04 +0300 : > > AC> День добрый, > AC> Вот хотелось-бы узнать такую вещь: > AC> В подпрограмму (foo) передают некий скаляр, если это reference - то > AC> считаем что это некий объект который поддерживает метод print и с > AC> помощью этого метода выводим информацию, если это не reference - то > AC> считаем что это имя файла который нужно открыть и выводить в него > AC> информацию. > > AC> Теперь если я хочу вывести информацию на STDOUT я передаю foo( > AC> *STDOUT ), но *STDOUT - это не reference 8-/ и у него нет метода > AC> print. > > AC> $ perl -e '$o = *STDOUT; print STDOUT ( "ref: <", ref( $o ), ">\n")' > AC> ref: <> > AC> $ perl -e '$o = *STDOUT; $o->print( "ref: <", ref( $o ), ">\n")' > AC> Can't locate object method "print" via package "IO::Handle" at -e line 1. > > AC> Или я где-то в трех соснах заблудился, либо... > > use UNIVERSAL qw/can/; Про это я знаю, просто странно что в IO::Handle нету метода print, хотя: $ perldoc IO::Handle NAME IO::Handle - supply object methods for I/O handles SYNOPSIS use IO::Handle; $io = new IO::Handle; ... METHODS See perlfunc for complete descriptions of each of the following sup- ported "IO::Handle" methods, which are just front ends for the corre- sponding built-in functions: $io->close $io->eof $io->fileno $io->format_write( [FORMAT_NAME] ) $io->getc $io->read ( BUF, LEN, [OFFSET] ) $io->print ( ARGS ) $io->printf ( FMT, [ARGS] ) $io->stat $io->sysread ( BUF, LEN, [OFFSET] ) $io->syswrite ( BUF, [LEN, [OFFSET]] ) $io->truncate ( LEN ) то есть по документации вроде-бы как есть, а вот то, что я получаю после *STDOUT имеет тип IO::Handle но не имеет метода print. Хотя если как советует Maxim Yemelyanov в своем посте: IO::Handle->new_from_fd(fileno(STDOUT), 'w') то получаем полноценный IO::Handle объект. Просто не хотелось иметь такие сложности именно с STDOUT. Это ведь должен быть полноценный объект, то есть записи: print STDOUT "text\n"; и STDOUT->print( "text\n" ); должны быть полностью идентичные. А мы имеем: $ perl -e '$o = *STDOUT; print $o "Hi\n"' - работает правильно но с другой стороны: $ perl -e '$o = *STDOUT; $o->print( "Hi\n" )' Can't locate object method "print" via package "IO::Handle" at -e line 1. P.S. Да совсем забыл сказать: $ perl -v This is perl, v5.8.7 built for sparc-linux-gnu-thread-multi Copyright 1987-2005, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using `man perl' or `perldoc perl'. If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. Хотя на какой платформе собран перл - не важно - ошибка одна и та-же -- Andrey Chernomyrdin --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/65773d405946.html, оценка из 5, голосов 10
|