Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из файла вытащить символы и записать в массив 
:(
    Опции темы
Exion
Дата 13.10.2005, 23:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть 2 файла с некоторым содержанием (близким, но во втрором файле есть дописанные данные). Мне надо сравнивать их и если есть различия, то эти различия копировать из второго фала и дописывать в конец первого.
Если считать файл в массив:
open (FILE, "<File.txt") #file opened for reading
or die ("Can't open file");
@file1=<FILE>;

то каждый элемент массива будет строкой из фала. А мне надо посимвольно сравнивать. Подскажите, пожалуйста, как к символу тогда обратиться в строке этого массива, а не к самой строке?
  Вверх
korob2001
Дата 14.10.2005, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Если читать файл нужно построчно, то всегда можно пройти по строке с помощью substr или разбивать строку на символы c помощью split, делать это в том случае, если строки не равны.
Насколько большие файлы?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Exion
Дата 14.10.2005, 08:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Попробую, на перле прогаю очень мало, поэтому не знаю таких функций. Файлы не большие, ты имеешь ввиду скопировать в временнй файл данные, а не в массив? Мне массив подойдет.
  Вверх
chaos
Дата 14.10.2005, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



а может быть еще для этого подлключить стандартный дифф
PM WWW   Вверх
Exion
Дата 14.10.2005, 13:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Какой-такой дифф?
  Вверх
BlackLFL
Дата 14.10.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 1
Всего: 12



Код

my $first="Приет мой друг";
my $second="Привет мой друг";

for my $i (0..length $second) {
print substr($first,$i,1) ."<br>"if(substr($first,$i,1) ne substr($second,$i,1));
}

я думаю такого примера хватит, чтобы выполнить задачю ...

Это сообщение отредактировал(а) BlackLFL - 14.10.2005, 14:43
PM WWW   Вверх
Exion
Дата 14.10.2005, 15:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за пример, правда он не совсем правильно работает
для кода:
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 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В перле можно писать цикл фор внутри другого фора?
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата
В перле можно писать цикл фор внутри другого фора?

Можно, вложенность циклов может быть какой угодно, причём не важно какие циклы while, for, foreach или until ты используешь.

Мне не совсем понятна суть задачи, если не трудно, поясни. Тебе нужно именно добавлять в конец первого файла или же тебе нужно делать копию второго файла, если были сделаны какие-то изменения в нём? Если добавлять в конец, то попробуй такокой вариант:
Код

#!/usr/bin/perl -w
use strict;

# Подпрограмма облегчает чтение из файла
sub readFile {
        my $file = shift;
        open(F, "< $file") or die $!;
        chomp(my @temp = <F>);
        close(F);
        return wantarray ? @temp : \@temp;
}

# Получаем ссылки на массивы первого и второго файла
my $f1 = readFile("first.txt");
my $f2 = readFile("second.txt");

# Открываем первый файл для добавления
open (ADD, ">> first.txt") or die $!;

# Итерируем по второму файлу
for (my $i=0; $i < @$f2; $i++)
{
     # Если строки из файлов не равны
     if ($f1->[$i] ne $f2->[$i])
     {
          my $pos = 0;
          # Проходим по каждому символу текущей строки из второго файла
          while (my $char2 = substr($f2->[$i],$pos,1))
          {
                 # Если текущая позиция больше длины строки из первого файла или
                 # текущий символ второго файла не равен текущему символу первого файла
                 if (($pos > length($f1->[$i])) or ($char2 ne substr($f1->[$i],$pos,1)))
                 {
                        # Записываем этот символ в конец первого файла
                        print ADD "$char2\n";
                 }
                 $pos++;
          }
     }
}

close(ADD);

Ну а если копию, то всё намного проще.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 15.10.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



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

1. сравниваешь размеры файлов:

- если одинаковые, то
выход,
- иначе
создаешь копию второго файла (или большего файла)
переименовываешь копию в имя первого файла

2. выход

smile

Это сообщение отредактировал(а) sharq - 15.10.2005, 11:11


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Exion
Дата 15.10.2005, 19:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











sharq: smile)) не, если второй файл содержит дописанные данные, тогда их оттуда надо вытащить и дописать в конец первого, ну или просто вытащить дописанные слова и куда-нить сохранить, например, в новый файл.
korob2001 : даю проге на вход имена двух файлов: первый - оригинал, второй файл с дописанными данными (вида: символы, буквы англ. алфавита, знаки типо [], ":"). Программа должа найти эти новые данные и вытащить их, допустим записать в новый файл. Думаю надо искать с помощью регулярных выражений слова (т.е. символы между пробелами) и если не совпадает, то вытаскивать это слово и записывать. Спасибо, что не поленился написать столько кода. Сейчас буду разбираться...
  Вверх
korob2001
Дата 16.10.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Exion - если нужно сохранять эти данные в отдельный файл, то просто укажи другое имя файла при открытии, для добавления. Ну а имена файлов получай через @ARGV

Это сообщение отредактировал(а) korob2001 - 16.10.2005, 19:16


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Exion
Дата 16.10.2005, 21:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я знаю, прогал раньше на сях нормально smile. НАписал, короче, я прогу, только используя много циклов. На слова разбивал и с ними оперировал. Спасибо за помощь.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.