2012-07-16 24 views
7

Tôi đang cố gắng tìm ra cách để có được một mô-đun Perl để thích nghi và mở một tham chiếu đến một tập tin. Bạn sẽ hiểu những gì tôi có nghĩa là khi bạn nhìn thấy chương trình chính:Làm thế nào để hủy đăng ký một bản sao tệp tin STDIN?

#!/usr/bin/perl 
use strict; 
use warnings; 

use lib '/usr/local/share/custom_pm'; 
use Read_FQ; 

# open the STDIN filehandle and make a copy of it for (safe handling) 
open(FILECOPY, "<&STDIN") or die "Couldn't duplicate STDIN: $!"; 

# filehandle ref 
my $FH_ref = \*FILECOPY; 

# pass a reference of the filehandle copy to the module's subroutine 
# the value the perl module returns gets stored in $value 
my $value = {Read_FQ::read_fq($FH_ref)}; 

# do something with $value 

Về cơ bản, tôi muốn chương trình chính để nhận đầu vào thông qua STDIN, tạo một bản sao của filehandle STDIN (để xử lý an toàn) sau đó vượt qua một tài liệu tham khảo với bản sao đó cho read_fq() chương trình con trong tệp Read_FQ.pm (mô-đun perl). Sau đó, chương trình con sẽ đọc đầu vào từ bộ xử lý tệp đó, xử lý nó và trả về một giá trị. Ở đây tệp Read_FQ.pm:

package Read_FQ; 

sub read_fq{ 
my ($filehandle) = @_; 
my contents = ''; 

open my $fh, '<', $filehandle or die "Too bad! Couldn't open $filehandle for read\n"; 
while (<$fh>) { 
# do something 
} 
close $fh; 
return $contents; 

Đây là nơi tôi đang gặp sự cố. Trong giai đoạn cuối, khi tôi vượt qua một tên tập tin cho chương trình chính để mở:

cat file.txt | ./script01.pl

nó mang lại cho các thông báo lỗi sau: Too bad! Couldn't open GLOB(0xfa97f0) for read

này nói với tôi rằng vấn đề là làm thế nào tôi đang dereferencing và mở tham chiếu đến tập tin trong mô-đun perl. Chương trình chính là ổn. Tôi đọc rằng $refGlob = \*FILE; là một tham chiếu đến một tập tin xử lý và trong nhiều trường hợp, nên tự động được dereferenced bởi Perl. Tuy nhiên, đó không phải là trường hợp ở đây. Có ai biết làm thế nào để dereference một filehandle ref để tôi có thể xử lý nó?

cảm ơn. Bất kỳ đề xuất được đánh giá rất nhiều.

Trả lời

4

Bạn cần mở $filehandle - bạn đã mở FILECOPY, lấy một tham chiếu và đặt nó trong $FH_ref, là $filehandle. Nếu bạn muốn mở lại lần nữa, hãy sử dụng đối số <& trong open hoặc chỉ bắt đầu đọc từ số ngay lập tức.

+0

ah được rồi. Vì vậy, tôi không cần phải mở lại tệp handhandle một lần nữa trong mô-đun. Tôi chỉ có thể bắt đầu đọc từ '$ FH_ref' ngay lập tức. Được rồi, điều đó rõ ràng. Tôi nghĩ tôi cần phải suy nghĩ để sử dụng nó. cảm ơn – cooldood3490

2

Nếu tôi hiểu đúng, bạn muốn tương đương với

open my $fh, '<&STDIN' 

Đó sẽ là

open my $fh, '<&', $filehandle 

Tôi không biết lý do tại sao bạn muốn điều đó, mặc dù.

Các vấn đề liên quan