일단 객체 지향 프로그래밍을 배우면 간단합니다. 적절한 교재에 대한 권장 사항은 스택 오버플로 보관 파일을 참조하십시오. 아래 설명을 따르려면 bless
이 해시 레프 에서뿐만 아니라 작동한다는 사실을 명심해야합니다.
POSIX 시스템 호출이 수행하는 내용과 C 및 Perl의 파일 설명자, 그리고 그것이 가리킬 수있는 모든 종류의 것들과 FD가 Perl로 전달되는 방법을 이미 완전히 이해해야합니다. 글로브. 이 부분들이 혼란 스럽다면, 별도의 질문을 열고 이것을 참고하십시오.
use IO::Pipe qw();
my $pipe = IO::Pipe->new($reader, $writer);
TL; DR 버전 : $reader
및 $writer
이 파일을 것으로 예상된다 당신을 처리 또는 뭔가 다른이 open
함수 또는 IO::File
인스턴스에서 가장 가능성이, 이전 열었습니다. 설명서에는 IO :: Handle forece가 언급되어 있습니다. 왜냐하면 적절한 파일이 아닌 FD (표준 출력 (STDIN, STDOUT))가 특정 프로세스에 연결되기를 원하기 때문입니다. 이러한 목적으로 IO :: Handle 만 있으면 충분합니다.
상세한 버전 :
는 $reader
$writer
및 변수 ($reader
는 IO::Handle
-A) 타입의 IO::Handle
객체 인스턴스를 포함 할 것으로 예상된다. IO::Handle
은 거의 사용되지 않으며 더 자주 서브 클래스 IO::File
으로 사용됩니다.
use IO::File qw();
my $reader = IO::File->new('/usr/src/linux/COPYING', 'r');
# bless(*Symbol::GEN0 => 'IO::File')
$reader->fileno
# 6
$reader->can('getline')
# true
use IO::File::WithPath qw();
my $writer = IO::File::WithPath->new('/tmp/foobar', 'w');
$writer->fileno
# 7
$writer->can('print')
# true
역사적인 이유로 많은 것들이 IO :: Handle 작업의 엄격한 하위 클래스가 아닙니다. IO :: Handle ("duck type")처럼 동작하기 만하면됩니다. 즉, 설명서에 언급 된 일부 메소드를 제공하고 IO :: Handle에서 상속받을 필요는 없습니다.
open my $other_reader, '<', '/usr/src/linux/COPYING';
# \*{'::$other_reader'}
$other_reader->fileno;
# 8
$other_reader->can('getline');
# false, but works anyway, see http://p3rl.org/IO::Handle#BUGS
use File::Temp qw(tempfile);
my ($other_writer) = tempfile;
# \*{'File::Temp::$fh'}
$other_writer->fileno;
# 9
$other_writer->can('print')
# false, but works anyway, see http://p3rl.org/IO::Handle#BUGS
use IO::String qw();
my $s = IO::String->new("foo\nbar\nbaz");
# bless(*Symbol::GEN1 => 'IO::String')
$s->fileno
# undef
$s->can('getline')
# true
### TODO
use File::Map qw(map_handle);
map_handle my $map, '/boot/vmlinuz'; # ???
### TODO some popen examples
이것은 훌륭한 답변입니다, 감사합니다. 나는 펄 객체가 어떻게 작동하는지 알지만,이 매뉴얼의 정확한 표현은 다소 불분명하다. 일단 시간이 더 있으면, 나는 그것을 읽고 그것을 잘하면 대답을 받아 들일 것입니다. –