2014-12-16 3 views
0

Я не могу скопировать содержимое одного файла в другой с помощью кода ниже.Копирование содержимого файлов в perl

open(DATA1, "+>>text.txt") or die "Couldn't open file text.txt, $!"; 
open(DATA2, "+>>text11.txt") or die "Error $!"; 

for ($a = 0; $a < 10; $a++) { 
    print DATA1 "Test Line $a\n" 
} 
while (<DATA1>) { 
    print DATA2 "$_"; 
} 

close (DATA1); 
close (DATA2); 

Может ли кто-нибудь помочь в потере кода?

+3

Вы не читаете данные1. вы пишете кучу вещей, оставьте указатель файла на END данных1, а затем попробуйте прочитать его. ну, вы уже в EOF, так что читать нечего. –

ответ

1

Сначала вы открываете файл в конце файла, открывая его в режиме «+ >>». При печати на нем сохраняется позиция файла в конце файла. Для того, чтобы читать от начала файла, вам нужно seek обратно к началу:

open(DATA1, "+>>text.txt") or die "Couldn't open file text.txt, $!"; 
open(DATA2, "+>>text11.txt") or die "Error $!"; 

for ($a=0; $a<10; $a++){ 
print DATA1 "Test Line $a\n"} 

seek(DATA1, 0,0); # rewind 

while(<DATA1>){ 
print DATA2 "$_";} 

close (DATA1); 
close (DATA2); 

Однако, если вам не нужно целый много вариантов обработки, вы можете использовать File::Copy просто скопировать или перемещать файлы из одного места в другое. Он поддерживает файловые дескрипторы.

1

Вы должны, вероятно, seek(DATA1,0,0) переместить указатель файла в начало, прежде чем пытаться его прочитать.

0

Во-первых, всегда используйте строгий и Предупреждения.

Если все, что вам нужно сделать, это скопировать один файл в другой, используйте File::Copy:

use strict; 
use warnings; 
use feature qw(say); 

use File::Copy; 

my $file1 = "..."; 
my $file2 = "..."; 

copy $file1, $file2 or die qq(Can't copy '$file1' to '$file2'); 

Или, вы можете сначала открыть файлы. Это удобно, если вы уже манипулируя сами файлы:

use strict; 
use warnings; 
use autodie; 
use feature qw(say); 

use File::Copy; 

my $file1 = "..."; 
my $file2 = "..."; 

open my $fh1, "<", $file1; 
open my $fh2, ">", $file2; 

copy $fh1, $fh2; 

В этом втором примере, я use autodie. Этот pragma заставит вашу программу прервать работу файла. Таким образом, вам не нужно продолжать делать or die qw(...); после каждого открытия файла, закрытия его или записи на него.

use File::Copy импортирует команды copy и move в Perl. Это Стандартный модуль, что означает, что вы можете использовать его, не беспокоясь о том, будет ли он работать или не будет работать в конкретной системе.