| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Из файла вытащить символы и записать в массив |
| Автор: Exion 13.10.2005, 23:07 |
| Есть 2 файла с некоторым содержанием (близким, но во втрором файле есть дописанные данные). Мне надо сравнивать их и если есть различия, то эти различия копировать из второго фала и дописывать в конец первого. Если считать файл в массив: open (FILE, "<File.txt") #file opened for reading or die ("Can't open file"); @file1=<FILE>; то каждый элемент массива будет строкой из фала. А мне надо посимвольно сравнивать. Подскажите, пожалуйста, как к символу тогда обратиться в строке этого массива, а не к самой строке? |
| Автор: korob2001 14.10.2005, 01:20 |
| Если читать файл нужно построчно, то всегда можно пройти по строке с помощью substr или разбивать строку на символы c помощью split, делать это в том случае, если строки не равны. Насколько большие файлы? |
| Автор: Exion 14.10.2005, 08:40 |
| Попробую, на перле прогаю очень мало, поэтому не знаю таких функций. Файлы не большие, ты имеешь ввиду скопировать в временнй файл данные, а не в массив? Мне массив подойдет. |
| Автор: chaos 14.10.2005, 10:51 |
| а может быть еще для этого подлключить стандартный дифф |
| Автор: Exion 14.10.2005, 13:10 |
| Какой-такой дифф? |
| Автор: BlackLFL 14.10.2005, 14:42 | ||
я думаю такого примера хватит, чтобы выполнить задачю ... |
| Автор: Exion 14.10.2005, 15:25 |
| Спасибо за пример, правда он не совсем правильно работает для кода: my $first="hellooi my fr"; my $second="hello my ft"; он выдает: o<br>i<br> <br>m<br>y<br> <br>f<br> т. е . до пробела исправляет. Думаю это можно легко исправить, сейчас попробую. |
| Автор: Exion 14.10.2005, 17:12 |
| В перле можно писать цикл фор внутри другого фора? for($line=0;$line<=$#file1;$line++) { for my $i (0..length $file1[$line]) { print substr($file1[$line],$i,1) ." " if(substr($file1[$line],$i,1) ne substr($file2[$line],$i,1)); } } Например, здесь вылетают ошибки. Походу $line внутри второго фора не определен. |
| Автор: korob2001 15.10.2005, 04:35 | ||||
Можно, вложенность циклов может быть какой угодно, причём не важно какие циклы while, for, foreach или until ты используешь. Мне не совсем понятна суть задачи, если не трудно, поясни. Тебе нужно именно добавлять в конец первого файла или же тебе нужно делать копию второго файла, если были сделаны какие-то изменения в нём? Если добавлять в конец, то попробуй такокой вариант:
Ну а если копию, то всё намного проще. |
| Автор: sharq 15.10.2005, 11:09 |
| Exion если файла почти одинаковые и могут отличаться тем, что во втором дописаны новые строчки, то можно сделать так. 1. сравниваешь размеры файлов: - если одинаковые, то выход, - иначе создаешь копию второго файла (или большего файла) переименовываешь копию в имя первого файла 2. выход |
| Автор: Exion 15.10.2005, 19:02 |
| sharq: korob2001 : даю проге на вход имена двух файлов: первый - оригинал, второй файл с дописанными данными (вида: символы, буквы англ. алфавита, знаки типо [], ":"). Программа должа найти эти новые данные и вытащить их, допустим записать в новый файл. Думаю надо искать с помощью регулярных выражений слова (т.е. символы между пробелами) и если не совпадает, то вытаскивать это слово и записывать. Спасибо, что не поленился написать столько кода. Сейчас буду разбираться... |
| Автор: korob2001 16.10.2005, 19:15 |
| Exion - если нужно сохранять эти данные в отдельный файл, то просто укажи другое имя файла при открытии, для добавления. Ну а имена файлов получай через @ARGV |
| Автор: Exion 16.10.2005, 21:12 |
| Я знаю, прогал раньше на сях нормально |