2010-07-12 4 views
0

J'ai une chaîne contenant beaucoup de texte avec-espaces blancs comme:Copier une chaîne (passée comme arguments de ligne de commande à Perl) dans un fichier texte

String str = "abc xyz def"; 

Je passe maintenant cette chaîne comme un argument de ligne de commande dans un fichier Perl en utilisant C# comme dans:

Process p = new Process(); 
p.StartInfo.FileName = "c:\\perl\\bin\\perl.exe"; 
p.StartInfo.Arguments = "c:\\root\\run_cmd.pl " + str + " " + text_file; 

dans le fichier run_cmd.pl, je le follwing:

open FILE, ">$ARGV[1]" or die "Failed opening file"; 
print FILE $ARGV[0]; 
close FILE; 

O n impression, je ne peux copier qu'une partie de la chaîne, c'est-à-dire "abc", dans le fichier text_file puisque Perl l'interprète comme un seul argument.

Ma question est, est-il possible pour moi de copier la chaîne entière dans le fichier texte, y compris les espaces blancs?

Répondre

2

Si vous voulez un argument séparé de l'espace blanc traité comme un seul argument, avec la plupart des programmes, vous devez entourer avec " "

par exemple run_cmd.pl "abc xyz def" filename

Essayez

p.StartInfo.Arguments = "c:\\root\\run_cmd.pl \"" + str + "\" " + text_file; 

Side note:

Je ne sais pas à propos de Windows, mais sous Linux il y a un number of arguments and maximum length of one argument limit donc vous pourriez vouloir envisager de passer la chaîne d'une autre manière, en le lisant à partir d'un fichier tmp par exemple.

+0

Hey miedwar, merci beaucoup !! Cela a aidé. – gofeddy

1

Ce n'est pas perl - c'est votre shell. Vous devez mettre des guillemets autour des arguments:

p.StartInfo.Arguments = "c:\\root\\run_cmd.pl '" + str + "' " + text_file; 

Si text_file provient de l'entrée d'utilisateur, vous voudrez sans doute citer que, aussi.

(Vous aurez également besoin d'échapper à toutes les citations existantes dans str ou text_file, je ne suis pas sûr de ce que la bonne façon d'échapper à une citation dans Windows est)

2

Il est un peu un hack, mais

$ARGV[$#ARGV] 

serait le dernier élément de @ARGV et

@ARGV[0 .. ($#ARGV - 1)] 

serait tout avant.

+0

Beau hack. Ça marche. – gofeddy

+0

Merci! Je suis encore nouveau ici, alors n'hésitez pas à me donner un point si vous le trouvez utile. –

0

@meidwar a dit: « vous voudrez peut-être envisager de faire passer la chaîne d'une autre manière, la lecture à partir d'un fichier tmp par exemple »

Je vous suggère de regarder dans une ambiance ouverte. Voir http://search.cpan.org/~jhi/perl-5.8.0/pod/perlopentut.pod#Pipe_Opens et http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC

Ils vous permettent d'envoyer autant de données que votre code appelé peut gérer et ne sont pas soumis à des limitations de la ligne de commande du système d'exploitation.

Questions connexes