Народ, помогите плииз.
Есть у меня файл, допустим tst.123
В нём приблизительно такая инфа:
Name:xxx Src:0 Max=3000.123 Min= 92.234
Name:yyy Src:0 Max= 125.222 Min= 0.354
.
.
.
Name:xxx Src:0 Max=4567.482 Min= 195.567Вопрос, как мне на перле написать прогу которая бы считывала числовые значения Max и Min (для конкретной строки по имени (yyy, xxx, zzz)сумировало их и выводило эти значения в новый файл???
Помогите плииз, а то повесят на работе.(((
А пробелы после знака равенства в этом файле, так же как и в примере, то есть, то нет?
Это я к тому, что они могут сделать бяку при разделении строки с помощью split.И второй вопрос: насколько критично в данном случае использование perl? Если пробелов после знаков равенства не будет, то достаточно такой строчки:
$ cat tst.123 | gawk '{print $3 " " $4}' | gawk -F= '{print $2 " " $3}' | gawk 'BEGIN {min=0; max=0} {max=max+$1; min=min+$3} END {print "Max = " max " Min = " min }' >> tst.out
да пробелы то есть то нет.
И использование перла очень критично. А ещё горит конкретно, как говорится нужно было ещё на позавчера
Как вариант:$var =~ s/\s+//g;
($garbage,$max,$min)=split(/Max\=|Min\=/,$var);
#!/usr/bin/perlopen (IN, "tst.123");
$max_sum=0;
$min_sum=0;while (<IN>) {
for ($i=0; $i<6; $i++) {
~s/= /=/;
~s/ / /;
~s/\t/ /;
}@array=split (' ',$_);
@max=split ('=',$array[2]);
@min=split ('=',$array[3]);
$max_sum+=$max[1];
$min_sum+=$min[1];
}close IN;
open (OUT, ">tst.out");
print OUT "Max = $max_sum\tMin = $min_sum\n";
close OUT;P.S.: Пока писал, XMan дал ответ, причем гораздо лучше, чем мой. Внесу единственную поправку:
$var=$_; # без этого присваивания - не сработает
$var=~ s/\s+//g;
($garbage,$max,$min)=split(/Max\=|Min\=/,$var);или, как вариант:
$_=~ s/\s+//g;
($garbage,$max,$min)=split(/Max\=|Min\=/,$_);
Встречная поправка для случая, если читается в $_ (например, посредством while (<>)):s/\s+|\n|\r//g;
($garbage,$max,$min)=split(/Max\=|Min\=/);PS. \n и \r это на случай, если до этого chomp не делается.
спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида:
VitaR -> 47.286
mc_all -> 0
Galch -> 20.394
Pamap -> 0
Zuk -> 0
Rakzi -> 0.579
Myhiv -> 0
Redex -> 0
sal -> 0
Но возник новый вопрос, как написать скрипт, который бы теперь через логин и пароль в html-странице выдавал значение из этого текстового файла (конкретное)ю
Например логин Login: VitaR
Passwd: 1234
И результатом исполнения выводится: 47.286
Подскажите плиз
>спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида:
>
>VitaR -> 47.286
>mc_all -> 0
>Galch -> 20.394
>Pamap -> 0
>Zuk -> 0
>Rakzi -> 0.579
>Myhiv -> 0
>Redex -> 0
>sal -> 0
>Но возник новый вопрос, как написать скрипт, который бы теперь через логин
>и пароль в html-странице выдавал значение из этого текстового файла (конкретное)ю
>
>Например логин Login: VitaR
>
> Passwd: 1234
>И результатом исполнения выводится: 47.286
>Подскажите плиз
D httpd.conf включить авторизацию и пользоваться REMOTE_USER в окружении:#!/usr/bin/perl
use strict;my $result;
open(DATA, "</your/file") || die $!;
while(<DATA>){
if(/^$ENV{REMORTE_USER}[^\d.]*([\d.]+)[^\d.]+$/){$result = $1; last;}
}
close(DATA);
print "Content-type: text/plain\n\n";
print $result || "No such user\n";Если файл небольшой, то можно
#!/usr/bin/perl
use strict;
$/='';
open(FILE,"/your/file");
my $lines=<FILE>;
close(FILE);
my $result = ($lines =~ /\b$ENV{REMOTE_USER}\b[^\d.]+([\d.]+)/gsx)[0];
print "Content-type: text/plain\n\n".($result eq '' ? "No such user" : $result);Только $/ восстановить надо