2012-01-10 3 views
3

IO::Pipe perl 생성자에서 사용되는 인수는 무엇입니까? 나는이 문서에 표시되는 내용Perl에서 IO :: Pipe 생성자에 대한 인수는 무엇입니까?

은 다음과 같습니다

IO :: 파이프 :: 새로운 선택적으로 객체 핸들 :: IO으로 축복해야 두 개의 인수를 취하거나 그 서브 클래스. 이 두 객체는 ​​파이프에 대한 시스템 호출에 사용됩니다. 인수를 지정하지 않으면 새로운 IO :: Pipe 객체에서 메소드 핸들이 호출됩니다.

나는 그것이 의미하는 바를 실제로 얻지 못합니다. 누군가 예제/설명을 제공 할 수 있습니까?

답변

1

일단 객체 지향 프로그래밍을 배우면 간단합니다. 적절한 교재에 대한 권장 사항은 스택 오버플로 보관 파일을 참조하십시오. 아래 설명을 따르려면 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 및 변수 ($readerIO::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 
+0

이것은 훌륭한 답변입니다, 감사합니다. 나는 펄 객체가 어떻게 작동하는지 알지만,이 매뉴얼의 정확한 표현은 다소 불분명하다. 일단 시간이 더 있으면, 나는 그것을 읽고 그것을 잘하면 대답을 받아 들일 것입니다. –

0

man 3p pipe 참조 :

파이프() 함수는 파이프를 생성 인수 fildes에 두 파일 디스크립터 번 각각 배치한다 [0] fildes [1], 개방 참조 그 읽기 및 쓰기에 대한 파일 설명은 파이프의 끝입니다.

보십시오.

+0

děkuju za odpověð a zdravím.:-) –