Cкрипт замены последовательностей символов

Вопросы и обсуждения, касающиеся программирования на Perl.
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Cкрипт замены последовательностей символов

Сообщение ZEN » 30 июл 2013, 20:44

[spoiler="Подробное описание задания"]Написать скрипт замены последовательностей символов.
Входные параметры: строка и хеш замен, которые хранятся во внешнем файле.
Формат файла: Первой в файле указывается строка подстановки. Далее указываются
данные в формате ключ – значение, разделенные символами ‘=’ или ‘=>’. Ключи
и значения должны состоять из букв и цифр, не содержать пробелов и могут быть
заключены в одинарные или двойные кавычки.
Строки, начинающиеся с символа # - считаются комментариями и игнорируются.
Сценарий должен принимать имя файла входным параметром.
Ключ хеша: последовательность символов, которую нужно заменить. Значение хеша:
последовательность символов для замены.
Выходные данные: Строка с заменёнными последовательностями
При возникновении ошибки: вывести на STDERR текст ошибки, а на STDOUT - 0 (ноль).

Условия:
- уже заменённые последовательности нельзя заменять дальше, т.е. если есть:
aaa => dd
aa => eefff
dd => ccc
то в итоговой строке “aaa” должно быть заменено на “dd”, а не на “eefffa” и не на “ccc”

- Ключи хеша должны быть отсортированы в обратном порядке
- длины последовательностей (как и самой строки) могут быть произвольными[/spoiler]

Код: Выделить всё

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

# use first argument of script as file name whith data
my $test_file_path = $ARGV[0];
# open file and get file handler or die
open( FH, "<", "$test_file_path") or die "Can not open test file: $!";
my $first_key = "";
my $str = "";
# line counter
my $count = 0;
# future hash
my %values; # original key - value for replace
my %tmphash; # key [#####] - value for replace
my $sharp; # [#####] delimetr
while (<FH>) {
    my $tmp = $_; # remove \s when needet
    # Remove new line character
    $tmp =~ s/\n//g;
    $tmp =~ s/^\s+//g;
    # Remove comments
    $tmp =~ s/\s*#.*//g;

    if ($count == 0 && $tmp =~ m/[0-9a-zA-Z]+/) { # if first step
        $first_key = $tmp; # set key
        $count++;
        next;
    } elsif ($count == 0) {
        print "0\n";
        warn("Error. No valid data - $tmp\n");
        exit -1;
    }
    
    # Skip empty line and comments
    if ($tmp =~ m/^#/ || $tmp =~ m/^\s*$/) {
        next;
    }
    
    if ($tmp =~ m/(.+)(=>|=)(.+)/ ) {
        my ($k, $v) = ($1, $3);
        $k =~ s/\s+$//;
        $k =~ s/^\s+//g;
        $v =~ s/\s+$//;
        $v =~ s/^\s+//g;
        # Remove "|' pair for key
        if ($k =~ m/^'(.+)'$/) {
            $k =~ s/^'//;
            $k =~ s/'$//;
        } elsif ($k =~ m/^"(.+)"$/) {
            $k =~ s/^"//;
            $k =~ s/"$//;
        }
        # Remove "|' pair for value
        if ($v =~ m/^'(.+)'$/) {
            $v =~ s/^'//;
            $v =~ s/'$//;
        } elsif ($v =~ m/^"(.+)"$/) {
            $v =~ s/^"//;
            $v =~ s/"$//;
        }
        # Validate key and value
        if ($k=~/\W/||$v=~/\W/) {
            print "0\n";
            warn("Error. Key or value missmath - $k=>$v\n");
            exit -2;
        }
        # fill hashes
        $values{$k} = $v;
        $sharp .= "#";
        $tmphash{$v} = $sharp;
        #print "$k\t=>\t$v\n";
    } elsif (!($tmp =~ m/^(\s*?)$/ || $tmp =~ m/^\s*\#.*+/)) {
        print "0\n";
        warn("Error. Data missmath - $tmp\n");
        exit -3;
    } # else comment or empty line
    $count++;
}

#if (scalar(keys %tmphash) < 1) {
#    print "0\n";
#    warn("Error. No hash found\n");
#    exit -4;
#}

# Replace keys as [#]..[##]
for my $key (sort {$b cmp $a} keys %values) {
    $first_key =~ s/$key/\[$tmphash{$values{$key}}\]/g;
}
# Replace [#]..[##] as values
for my $key (keys %values) {
    $first_key =~ s/\[$tmphash{$values{$key}}\]/$values{$key}/g;
}

print $first_key."\n";

exit 0;
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей