Вывести таблицу частот для каждого уникального значения из массива

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

Вывести таблицу частот для каждого уникального значения из массива

Сообщение ZEN » 29 июл 2013, 18:12

[spoiler="Подробное описание задания"]Дан массив элементов (чисел или строк a-zA-Z_0-9).
Вывести таблицу частот для каждого уникального значения из массива в виде:
[значение] ******
Здесь кол-во звездочек соответствует кол-ву вхождений определенного значения в массив.
При ошибке выводить слово “error” на STDOUT, и описание ошибки на STDERR

Входные данные: файл с массивом чисел или строк.

Выходные данные: таблица частот, отсортированная по словам.

Например:

cat test2.txt
as fg re re df as as asa s as s s s s s s s

\w \d
a-zA-Z_ 0-9
my @new_array = sort @old_array;

Результат:

./Task2_2.pl test2.txt
as ****
asa *
df *
fg *
re **
s ********[/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: $!";
# read first line
my $str = <FH>;
# if empty line
if (! defined $str) {
    print "error\n";
    warn("empty line");
    exit -1;
} 
# if file has more lines
if (<FH>) { 
    warn("$test_file_path has more then 1 line data");
}
# replace spaces as one space character
$str =~ s/\s+/ /g;
# split string as array 
my @array = split(/[\s]/, $str);
# hash with resultat in future
my %values;
# write array in hash as keys and concat "*" symbol as count of word replays
$values{$_}.="*" foreach @array;
# temporaly buffer
my $buffer = "";
# prepare hash to output
foreach my $key ( sort keys %values ) { 
    # key validation
    my $tmp = $key;
    $tmp =~ s/[a-zA-Z0-9_\s]//g;
    # if key have unsupported symbols
    if ($tmp ne "") { # then inform
        print "error\n";
        warn("$key $values{$key} - unsupported symbols: \'$tmp\'");
        exit -2; # Broken file
    } else { # else show key and count of replays
        $buffer .= "$key $values{$key}\n";
    }
}
# flush buffer to STDOUT
print $buffer;
# close file handler
close ( FH );
# exit 
exit 0;
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

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

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