2015-02-16 1 views
0

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

use strict; 
use warnings; 

open(file1,"address0.txt") or die "Cannot open file.\n"; 
my $value; 
$value=<file1>; 
system("perl -p -i.bak -e 's/add/$value/ig' rough.sp"); 

Здесь значение, которое я хочу заменить, существует в файле address0.txt. Это одно значение 1. Я хочу поместить это значение вместо добавления в другой файл rough.sp.

Мой rough.sp выглядит

Vdd 1 0 add 

Мой address0.txt выглядит

1 

Так выход должен быть как

Vdd 1 0 1 

Пожалуйста, помогите мне. Заранее спасибо

+1

Это кажется каким-то грязным, чтобы быть с помощью 'system' вызов EXEC Perl внутри Perl. – Sobrique

ответ

0

Если предположить, что есть 1: 1 связь между линиями adress0.txt и rough.sp, вы можете продолжить так:

use strict; 
use warnings; 

my ($curline_1,$curline_2); 
open(file1, "address0.txt") or die "Cannot open file.\n"; 
open(file2, "rough.sp") or die "Cannot open file.\n"; 
open(file3, ">out.sp") or die "Cannot open file.\n"; 

while (<file1>) { 
    $curline_1 = $_; 
    chomp($curline_1); 
    $curline_2 = <file2>; 
    $curline_2 =~ s/ add/ $curline_1/; 
    print file3 $curline_2; 
} 
close(file1); 
close(file2); 
close(file3); 
exit(0); 

Объяснение:

Кодовые перебирает строки ваших входных файлов параллельно. Обратите внимание, что прочитанные строки включают терминатор линии. Содержимое строки из файла «address» принимается за заменяемые значения fpr литералу add в вашем .sp-файле. Линейные терминаторы из файла 'address' устраняются, чтобы не вводить дополнительные новые строки.

Добавление:

Расширение для мульти-замены может выглядеть следующим образом:

$curline_1 = $_; 
    chomp($curline_1); 

    my @parts = split(/ +/, $curline_1); # splits the line from address0.txt into an array of strings made up of contiguous non-whitespace chars 

    $curline_2 = <file2>; 
    $curline_2 =~ s/ add/ $parts[0]/; 
    $curline_2 =~ s/ sub/ $parts[1]/; 
    # ... 
+0

Привет, коллапсар .. Спасибо ... Но этот код не работает, ни на Linux, ни на Windows. На моем грубом.sp действительно содержится 100 строк. В любом случае мне нужно спросить, что переменная $ curline_1 получает значения? Проходит ли он через цикл? – Suhan

+0

Я тестировал его на окнах, и он работает как шарм - вы получаете сообщения об ошибках? Как выглядит выходной файл? Направьте свой вопрос: идиома 'while {...}' читает файл по строкам, присваивая каждой строке переменной '$ _', когда вы идете. Пс: была опечатка в «строгости»; - Я исправил его, теперь он работает? – collapsar

+0

Yaa его работая сейчас. Благодарю. Что здесь делает chomp. Это удаление пробелов в моем address0.txt или расщепление. Пожалуйста, предположите, что, если я хочу многоплодные замены. Тогда мой адресный файл будет подобен массиву. Затем мне нужно поместить несколько скалярных переменных, таких как $ curline_3 $ curline_4 и т. Д. ... – Suhan

Смежные вопросы