2009-02-11 9 views
5

J'essaye de porter un manuscrit de Perl d'Unix à Windows mais ai un temps presque impossible de le faire fonctionner en raison des tuyaux de forking non soutenus dans la fonction ouverte. Voici le code:Comment puis-je obtenir des tuyaux de forking pour travailler dans Perl sous 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'erreur est:

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

Est-ce que quelqu'un sait comment faire ce travail? Merci!

Mike

+0

Si le parent est juste assis à attendre la sortie de l'enfant, pourquoi fourchette du tout? – Schwern

+0

pour (my $ i = 1; $ i <@ $ résultat; $ i ++) {print $ résultat -> [$ i]; } mieux écrit que shift @ $ result; print @ $ résultat; (puisque vous ne l'utilisez pas après cela) ou imprimez $ result -> [$ _] pour 1 .. $ # result; Le style C pour les boucles mendient des erreurs off-by-one et est souvent mieux écrit en tant qu'opérateur de range. – Schwern

Répondre

5

Je sais que ce n'est pas une réponse directe à votre question, mais il semble que vous scripting quelque chose au-dessus de Perforce en Perl? Si c'est le cas, vous pouvez trouver une bibliothèque existante qui fait ce que vous voulez déjà et vous épargner beaucoup de maux de tête, ou au moins vous donner un exemple de code à partir duquel travailler.

Par exemple:

EDIT: Maintenant que je sais ce que vous faites, je devine que vous essayez de Port p42svn à Windows, ou plutôt le rendre compatible avec Windows au moins. Voir this thread pour une discussion de ce problème. La recommandation (non testée) est d'essayer les exemples de code répertoriés à http://perldoc.perl.org/perlfork.html sous "Forking pipe open() pas encore implémenté" pour créer explicitement le tuyau à la place.

+0

Yup, J'essaye de migrer une base de données de Perforce à la base de données de Subversion. Cependant, il y a seulement un script connu sur la planète qui peut le faire et ce script ne fonctionnera que sous UNIX ce qui n'est pas une option pour moi. J'essaie de porter le script sur Windows. Avant aujourd'hui, je n'ai jamais touché PERL –

+0

Ok, donc ça doit être p42svn alors. Voir ma réponse mise à jour – Jay

1

Ça ne va pas fonctionner tel quel. Vous devrez trouver une autre méthode pour accomplir ce qu'elle fait. Il ne semble pas qu'il y ait un besoin pour le fork-pipe, mais c'est difficile à dire car je ne sais pas ce qu'est un p4 et une grande partie de votre code est perdue en interprétation d'angle.

+0

Oui, je crois que le fork-pipe est utilisé pour gérer les fichiers binaires et les fichiers texte, car print() se comporte de manière incohérente. Voici un fil sur la question, mais personne ne l'a encore résolu: http://p42svn.tigris.org/ds/viewMessage.do?dsForumId=4900&dsMessageId=40586 –

Questions connexes