яндексова задачка
Nov. 6th, 2009 09:50 amвзята отсюда.
На сервере имеется файл /tmp/money. Каждая строка файла – последовательность символов без пробелов, состоящая из наименования валюты и номинала. Например, rubl100, bucks20, frank1.
Нужно дописать perl-скрипт, чтобы он вывел все строки из файла в порядке возрастания стоимости соответствующей банкноты.
мое решение:
использование:
На сервере имеется файл /tmp/money. Каждая строка файла – последовательность символов без пробелов, состоящая из наименования валюты и номинала. Например, rubl100, bucks20, frank1.
Нужно дописать perl-скрипт, чтобы он вывел все строки из файла в порядке возрастания стоимости соответствующей банкноты.
#!/usr/bin/perl -w
use strict;
# Курсы валют (предполагается, что все курсы,
# которые могут встретиться в файле, в этом хэше есть)
my $roe = {
frunk => 1,
tugrik => 100,
bobrik => 10,
};
мое решение:
my $re = sprintf "(%s)",join "|",keys %$roe;
print join "\n",map { $_->[0] } sort { $a->[1] <=> $b->[1] }
map { chomp; m#^$re(\d+)#o && [ $_,$2/$roe->{$1} ] } <>;
использование:
zsh# perl -le 'my $roe = { frunk => 1, tugrik => 100, bobrik => 10 };
my $re = sprintf "(%s)",join "|",keys %$roe;
print join "\n",map { $_->[0] } sort { $a->[1] <=> $b->[1] }
map { chomp; m#$re(\d+)#o && [ $_,$2/$roe->{$1} ] } <>' \
=( print -l frunk1 bobrik1 tugrik1 tugrik100 bobrik20 bobrik5 )
tugrik1
bobrik1
bobrik5
frunk1
tugrik100
bobrik20
zsh#
no subject
Date: 2009-11-06 11:20 am (UTC)При условии что в файле с данными последняя строка заканчивается правильно (с переводом строки)
no subject
Date: 2009-11-06 11:29 am (UTC)no subject
Date: 2009-11-06 11:31 am (UTC)no subject
Date: 2009-11-06 11:42 am (UTC)no subject
Date: 2009-11-06 12:21 pm (UTC)no subject
Date: 2009-11-06 12:46 pm (UTC)no subject
Date: 2009-11-06 09:58 pm (UTC)#!/usr/bin/perl -w use strict; # Курсы валют (предполагается, что все курсы, которые могут встретиться в файле, в этом хэше есть) my $roe = { frunk => 1, tugrik => 100, bobrik => 10, }; my $IN = "/tmp/money"; my $roe_re = join "|", keys %$roe; $roe_re = qr/$roe_re/o; open F, "< $IN" or die "Error opening '$IN': $!"; my @v; while () { chomp; next unless $_; if ( /^($roe_re)(\d+)$/ ) { my $cur_id = $1; my $amount = $2; push @v, [ $_, $amount * $roe->{$cur_id} ]; } else { warn "No currency rate for '$_' found"; } } close F; print join "\n", map { $_->[0] } sort { $a->[1] <=> $b->[1]} @v;Думаю, в реальном мире такой код поддерживать будет проще, чем набор заклинаний one-liner.
no subject
Date: 2009-11-06 10:01 pm (UTC)while (<F>) {скушал жж
no subject
Date: 2009-11-08 09:46 pm (UTC)