объединить файлы в одну папку в perl, использовать сценарий оболочки linux

В Linux, чтобы объединить все файлы в папке, вы можете сделать file=FOLDER/*; cat $file > ONEFILE, я также хочу использовать это в своем Perl-скрипте, поэтому я закодировал как system("file=$folder/*"); system("cat \$file > $out");

Но это не сработает, когда я запущу программу perl, $out будет присвоено имя файла как my $out = "outfile";. Внешний файл всегда имеет 0 бит. Что здесь не так.


person lolibility    schedule 26.06.2012    source источник
comment
Кажется, я уже знаю проблему.   -  person lolibility    schedule 26.06.2012


Ответы (2)


Первая строка устанавливает переменную среды $file в новом процессе оболочки:

system "file=$folder/*";

Вторая строка запускает новый процесс оболочки с новой средой:

system "cat \$file > $out";

Поскольку это новый процесс с новой средой, ваша предыдущая переменная $file больше не установлена, поэтому вы действительно выполняете следующую команду оболочки:

cat  > $out

Сделайте это вместо этого:

system "cat '$folder/'* > '$out';

Примечание. Я также добавил кавычки, которые помогут, если ваши пути могут содержать пробелы. Тем не менее, это все еще небезопасно для всех форм ввода, поэтому не передавайте какой-либо пользовательский ввод в эту команду без предварительной проверки.

person We Are All Monica    schedule 26.06.2012

Что насчет exec в Perl?

perl -e 'exec "cat *.txt"'

person Pavel Vlasov    schedule 26.06.2012