ocehb: (Default)
[personal profile] ocehb
взята отсюда.

На сервере имеется файл /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#

Date: 2009-11-06 11:20 am (UTC)
From: [identity profile] what-me.livejournal.com
#!/usr/bin/perl -w

use strict;

# Курсы валют (предполагается, что все курсы,
#  которые могут встретиться в файле, в этом хэше есть)
my $roe = {
  frunk => 1,
  tugrik => 100,
  bobrik => 10,
};

@ARGV=qw(/tmp/money);

print map  $_->[0],
      sort { $a->[1] <=> $b->[1] }
      map  { /\d+/; [ $_, $& * $roe->{$`} ] }
      <>;


При условии что в файле с данными последняя строка заканчивается правильно (с переводом строки)

Date: 2009-11-06 11:31 am (UTC)
From: [identity profile] what-me.livejournal.com
тогда сделаем /\d+$/

Date: 2009-11-06 12:21 pm (UTC)
From: [identity profile] what-me.livejournal.com
Ну и до кучи tugrik2tugrik

Date: 2009-11-06 09:58 pm (UTC)
From: [identity profile] alesk.livejournal.com
#!/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.

Date: 2009-11-06 10:01 pm (UTC)
From: [identity profile] alesk.livejournal.com
строчку
while (<F>) {

скушал жж

Profile

ocehb: (Default)
ocehb

January 2021

S M T W T F S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 6th, 2026 10:54 am
Powered by Dreamwidth Studios