Как я могу добавить файл foo2.txt в foo1.txt? - PullRequest
2 голосов
/ 21 января 2010

Есть ли способ выполнить foo2.pl из foo1.pl в Perl и добавить foo2.txt к foo1. txt затем создайте foo3.txt ? спасибо.

т.е.

foo1.pl

 print "Hello"; # output to foo1.txt;

foo2.pl

 print "World"; # output to foo2.txt;

Как создать foo3.txt файл на основе foo1.pl .

foo3.txt

Hello
World

Что-то вроде добавления foo2.txt к foo1.txt .

Насколько я знаю, я могу открыть foo1.txt и foo2.txt , затем включить строки в foo3.pl .

print FOO3_TXT (<FOO1_TXT>);
print FOO3_TXT (<FOO2_TXT>);

Есть ли хороший метод?


Обновить мой тест (ActivePerl 5.10.1)

Мой foo.pl

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

print "world\n";

my hw.pl (foo.pl и hw.pl в одном каталоге)

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

print 'hello '; 
print `./foo.pl`;

выход

** D: \ обучение \ Perl> hw.pl

привет '.' не распознается как внутренняя или внешняя команда, работающая программа или командный файл. **

Если hw.pl обновлен {}:

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

print q{hello }, qx{./foo.pl};

Сейчас вывод. (немного отличается от привет )

D: \ обучение \ Perl> hw.pl '' не распознается как внутренняя или внешняя команда, работоспособная программа или командный файл. привет

[Update].

Исправлено. см. ответ,

Ответы [ 5 ]

2 голосов
/ 21 января 2010

запустить это как скрипт

perl foo1.pl > foo3.txt;
perl foo2.pl >> foo3.txt;

содержимое foo1.pl

!#/bin/perl
print "Hello";

содержимое foo2.pl

!#/bin/perl
print "World";

или

просто используйте команду cat, если вы используете linux для добавления foo2.txt к foo1.txt.

1 голос
/ 02 марта 2010

Вы также можете использовать следующий код

file1.pl

use strict;
use warnings;

open (FH,">file") or die "$! can't open";
print FH "WELCOME\n";

file2.pl

use strict;
use warnings;

open (FH,">>file") or die "$! can't open";
print FH "WELCOME2\n";

Содержимое файла:

WELCOME 
WELCOME2 
1 голос
/ 21 января 2010

Использование сценария оболочки (например, файла .bat в Windows) для запуска различных сценариев Perl и объединения их вывода - один из способов решения проблемы. Тем не менее, я обычно нахожу, что сам Perl предоставляет более мощную и гибкую среду, чем сценарии оболочки. Чтобы использовать Perl таким образом, нужно начать с изучения команд system и exec .

Например:

# In hello.pl
print "Hello\n";

# In world.pl
print "World\n";

# In hello_world.pl.
use strict;
use warnings;
system 'perl hello.pl >  hello_world.txt';
system 'perl world.pl >> hello_world.txt';
1 голос
/ 21 января 2010

На всякий случай, если вы буквально о execute foo2.pl from foo1.pl in Perl, то вот что вы можете сделать:

print 'hello ';
print qx(perl foo2.pl);

qx - это еще один способ запуска системных команд, например обратных галочек. Таким образом, perl foo2.pl запускается с выводом, возвращаемым в ваш вызывающий Perl-скрипт.

Так что здесь то же самое с помощью обратных кавычек. Также он использует прямой вызов скрипта (что лучше):

print 'hello ';
print `./foo2.pl`;

И если вы ожидаете много выходных данных из скрипта, то лучше не загружать все это в память, как в двух приведенных выше примерах. Вместо этого используйте open примерно так:

print 'hello ';
open my $foo2, '-|', './foo2.pl';
print <$foo2>;
close $foo2;

И вы можете заключить это в один оператор печати для примера "hello world":

print 'hello ', do {
   open my $foo2, '-|', './foo2.pl';
   <$foo2>;
};

/ I3az /

0 голосов
/ 12 февраля 2018

Если вы заранее знаете, что скрипт, который вы хотите выполнить из другого скрипта, также является Perl, вы должны использовать do EXPR (https://perldoc.perl.org/functions/do.html). Это выполнит содержимое файла EXPR в контексте запущенного процесса perl и избавит вас от запуска новых экземпляров cmd.exe и perl.exe.

hello.pl:
print "Hello";
do "world.pl";

wordl.pl:
print "World";
...