2009-02-11 17 views
5

Tôi đang cố gắng chuyển một kịch bản Perl từ Unix sang Windows nhưng có một thời gian gần như không thể làm cho nó hoạt động do các ống dẫn không được hỗ trợ trong chức năng mở. Dưới đây là các mã:Làm cách nào để tôi có thể sử dụng ống hút để hoạt động trong Perl trên Windows?

sub p4_get_file_content { 
    my $filespec = shift; 
    return 'Content placeholder!' if ($options{'dry-run'}); 
    debug("p4_get_file_content: $filespec\n"); 
    local *P4_OUTPUT; 
    local $/ = undef; 
    my $pid = open(P4_OUTPUT, "-|"); 
    die "Fork failed: $!" unless defined $pid; 
    if ($pid == 0) { # child 
     my $p4 = p4_init(); 
     my $result = undef; 
     $result = $p4->Run('print', $filespec); 
     die $p4->Errors() if $p4->ErrorCount(); 
     if (ref $result eq 'ARRAY') { 
      for (my $i = 1; $i < @$result; $i++) { 
       print $result->[$i]; 
      } 
     } 
     $p4->Disconnect(); 
     exit 0; 
    } 
    my $content = <P4_OUTPUT>; 
    close(P4_OUTPUT) or die "Close failed: ($?) $!"; 
    return $content; 
} 

Lỗi này là:

'-' is not recognized as an internal or external command, 
operable program or batch file. 

Có ai biết làm thế nào để làm cho công việc này? Cảm ơn!

Mike

+0

Nếu cha mẹ chỉ ngồi chờ đợi đầu ra của đứa trẻ, tại sao lại là ngã ba? – Schwern

+0

cho (kết quả $ i = 1; $ i <@ $; $ i ++) {in $ result -> [$ i]; } tốt hơn được viết dưới dạng shift @ $ result; in kết quả @ $; (vì bạn không sử dụng nó sau đó) hoặc in kết quả $ -> [$ _] cho 1 .. $ # result; Kiểu C cho các vòng lặp bắt đầu cho các lỗi off-by-one và thường được viết tốt hơn như một toán tử phạm vi. – Schwern

Trả lời

5

Tôi biết đó không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng có vẻ như bạn đang viết thứ gì đó trên Perforce trong Perl? Nếu vậy, bạn có thể tìm thấy một thư viện hiện có làm những gì bạn muốn và tiết kiệm cho mình rất nhiều đau đầu, hoặc ít nhất là cung cấp cho bạn một số mã mẫu để làm việc.

Ví dụ:

EDIT: Bây giờ tôi biết những gì bạn đang làm tôi đoán bạn đang cố gắng cổng p42svn cho Windows, hoặc thay vì làm cho nó tương thích với Windows ít nhất. Xem this thread để thảo luận về vấn đề chính xác này. Đề xuất (chưa được kiểm tra) là thử các mẫu mã được liệt kê tại http://perldoc.perl.org/perlfork.html trong "Mở rộng ống nhánh() chưa được triển khai" để tạo đường ống một cách rõ ràng.

+0

Yup, tôi đang cố di chuyển cơ sở dữ liệu Perforce sang cơ sở dữ liệu Subversion. Tuy nhiên, chỉ có một kịch bản được biết trên hành tinh có thể làm điều này và tập lệnh đó sẽ chỉ chạy trên UNIX mà không phải là một lựa chọn cho tôi. Tôi đang cố gắng chuyển kịch bản sang chạy trên Windows. Trước ngày hôm nay, tôi chưa bao giờ chạm vào PERL –

+0

Ok, vì vậy đây phải là p42svn sau đó. Xem câu trả lời cập nhật của tôi – Jay

1

Nó sẽ không hoạt động như hiện trạng. Bạn sẽ cần phải tìm một phương pháp khác để thực hiện những gì nó đang làm. Nó không giống như có đốt cháy một nhu cầu cho các ngã ba đường ống, nhưng thật khó để nói vì tôi không biết p4 là gì và rất nhiều mã của bạn đang bị mất để giải thích khung góc.

+0

Vâng, tôi tin rằng ống nối được sử dụng để xử lý cả tệp nhị phân và tệp văn bản, vì in() hoạt động không nhất quán. Đây là một chủ đề về vấn đề này, tuy nhiên chưa có ai giải quyết nó: http://p42svn.tigris.org/ds/viewMessage.do?dsForumId=4900&dsMessageId=40586 –

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