2009-02-11 2 views
5

Ich versuche, ein Perl-Skript von Unix zu Windows zu portieren, aber ich habe eine fast unmögliche Zeit, es zu arbeiten wegen der nicht unterstützten Forking Pipes in der offenen Funktion. Hier ist der Code:Wie kann ich Forking Pipes in Perl unter Windows arbeiten lassen?

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; 
} 

Der Fehler ist:

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

Wer weiß, wie diese Arbeit zu machen? Vielen Dank!

Mike

+0

Wenn der Elternteil einfach nur herumsitzen und auf die Ausgabe des Kindes warten soll, warum überhaupt? – Schwern

+0

für (mein $ i = 1; $ i <@ $ ergebnis; $ i ++) {print $ ergebnis -> [$ i]; } besser geschrieben als shift @ $ result; Druck @ $ Ergebnis; (da du es danach nicht verwendest) oder drucke $ result -> [$ _] für 1 .. $ # result; C-Style for-Loops sind um einen Fehler nach dem anderen und oft besser als Range-Operator geschrieben. – Schwern

Antwort

5

Ich weiß, es ist nicht eine direkte Antwort auf Ihre Frage, aber es sieht aus wie Sie etwas auf der Perforce in Perl sind Scripting? Wenn dem so ist, könnte es sein, dass eine existierende Bibliothek bereits das tut, was Sie wollen, und Sie sich eine Menge Kopfzerbrechen ersparen können, oder Ihnen zumindest einen Beispielcode zum Arbeiten geben.

Zum Beispiel:

EDIT: Nun, da ich weiß, was du tust, ich vermute, Sie versuchen zu Port p42svn zu Windows, oder machen Sie es zumindest kompatibel mit Windows. Eine Erörterung dieses genauen Problems finden Sie unter this thread. Die Empfehlung (ungetestet) besteht darin, die unter http://perldoc.perl.org/perlfork.html aufgelisteten Codebeispiele unter "Forking Pipe Open() noch nicht implementiert" auszuführen, um stattdessen explizit die Pipe zu erstellen.

+0

Ja, ich versuche eine Perforce-Datenbank in die Subversion-Datenbank zu migrieren. Es gibt jedoch nur ein bekanntes Skript auf dem Planeten, das das kann und das Skript wird nur unter UNIX laufen, was für mich keine Option ist. Ich versuche das Skript auf Windows zu portieren. Vor heute habe ich PERL nie berührt –

+0

Ok, also muss dies dann p42svn sein. Siehe meine aktualisierte Antwort – Jay

1

Es funktioniert nicht wie es ist. Sie müssen eine andere Methode finden, um zu erreichen, was es tut. Es sieht nicht so aus, als würde das Fork-Pipe brennen, aber es ist schwer zu sagen, da ich nicht weiß, was ein p4 ist und viel Code geht verloren, wenn die Klammern interpretiert werden.

+0

Ja, ich glaube, die Fork-Pipe wird verwendet, um sowohl binäre Dateien und Textdateien zu behandeln, da print() sich inkonsistent verhält. Hier ist ein Thread zum Thema, aber niemand hat es bisher gelöst: http://p42svn.tigris.org/ds/viewMessage.do?dsForumId=4900&dsMessageId=40586 –

Verwandte Themen