Копирование строки (передаваемой в качестве аргументов командной строки в Perl) в текстовый файл - PullRequest
0 голосов
/ 12 июля 2010

У меня есть строка, содержащая много текста с пробелами, например:

String str = "abc xyz def";

Теперь я передаю эту строку в качестве аргумента командной строки в файл perl, используя C #, как в:

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

В файле run_cmd.pl у меня есть следующее:

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

При печати я могу скопировать только часть строки, то есть "abc", в text_file, поскольку Perl интерпретирует ее какодин аргумент.

У меня вопрос, могу ли я скопировать всю строку в текстовый файл, включая пробелы?

Ответы [ 4 ]

2 голосов
/ 12 июля 2010

Это немного хак, но

$ARGV[$#ARGV]

будет последним элементом в @ARGV, а

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

будет всем до этого.

2 голосов
/ 12 июля 2010

Если вы хотите, чтобы аргумент, разделенный пробелами, обрабатывался как один аргумент, в большинстве программ его необходимо окружить " "

например, run_cmd.pl "abc xyz def" filename

Попробуйте

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

Примечание:

Я не знаю о Windows, но в Linux есть количество аргументов и максимальная длина одного аргумента ограничение , так что вы можете рассмотретьпередавая строку другим способом, читая ее, например, из файла tmp.

1 голос
/ 12 июля 2010

Это не Perl - это ваша оболочка.Вам нужно заключить в кавычки аргументы:

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

Если text_file поступает из пользовательского ввода, вы, вероятно, тоже захотите процитировать это.

(Вам также понадобитсячтобы избежать любых существующих кавычек в str или text_file; я не уверен, каков правильный способ избежать кавычки в Windows)

0 голосов
/ 13 июля 2010

@ meidwar сказал: «Вы можете подумать о передаче строки другим способом, например, читая ее из файла tmp»

Я предлагаю вам взглянуть на канал.См. http://search.cpan.org/~jhi/perl-5.8.0/pod/perlopentut.pod#Pipe_Opens и http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC

Они позволяют отправлять столько данных, сколько может обработать ваш вызываемый код, и не подлежат ограничениям командной строки ОС.

...