2009-02-11 13 views
5

Sto provando a eseguire il porting di uno script Perl da Unix a Windows ma sto avendo un tempo quasi impossibile per farlo funzionare a causa dei tubi forking non supportati nella funzione open. Ecco il codice:Come posso ottenere biforcazioni tubi per funzionare in Perl su 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'errore è:

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

Qualcuno sa come fare questo lavoro? Grazie!

Mike

+0

Se il genitore sta per sedersi in attesa dell'uscita del bambino, perché forchetta? – Schwern

+0

per (my $ i = 1; $ i <@ $ result; $ i ++) {print $ result -> [$ i]; } scritto meglio come shift @ $ result; stampa @ $ risultato; (dal momento che non lo usi più) o stampa $ result -> [$ _] per 1 .. $ # result; Lo stile C per loop implora errori off-by-one e spesso è meglio scritto come operatore di intervallo. – Schwern

risposta

5

io so che non è una risposta diretta alla tua domanda, ma sembra che si sta script qualcosa in cima Perforce in Perl? Se è così, potresti trovare una libreria esistente che fa già ciò che vuoi e risparmiarti un sacco di mal di testa, o almeno darti un codice di esempio da cui lavorare.

Ad esempio:

EDIT: Ora che so quello che stai facendo Sto indovinando si sta cercando di porta p42svn a Windows, o meglio renderlo compatibile con Windows almeno. Vedi this thread per una discussione su questo problema esatto. La raccomandazione (non testata) è di provare gli esempi di codice elencati a http://perldoc.perl.org/perlfork.html in "biforcazione tubo aperto() non ancora implementato" per creare esplicitamente il tubo.

+0

Sì, sto provando a migrare un database Perforce nel database Subversion. Tuttavia, c'è solo uno script conosciuto sul pianeta che può farlo e quello script verrà eseguito solo su UNIX, che non è un'opzione per me. Sto cercando di eseguire il porting dello script per l'esecuzione su Windows. Prima di oggi, non ho mai toccato PERL –

+0

Ok, quindi questo deve essere p42svn allora. Vedere la mia risposta aggiornata – Jay

1

Non funzionerà così com'è. Avrai bisogno di trovare un altro metodo per realizzare ciò che sta facendo. Non sembra che ci sia bisogno di bruciare il fork-pipe, ma è difficile da dire dato che non so cosa sia un p4 e gran parte del tuo codice viene perso nell'interpretazione dell'angolo d'angolo.

+0

Sì, credo che il fork-pipe sia usato per gestire sia file binari che file di testo, dal momento che print() si comporta in modo incoerente. Ecco una discussione sul problema, ma nessuno lo ha ancora risolto: http://p42svn.tigris.org/ds/viewMessage.do?dsForumId=4900&dsMessageId=40586 –