URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3984
[ Назад ]

Исходное сообщение
"построчная считка значений из файла"

Отправлено Sasha , 21-Фев-05 12:13 
Народ, помогите плииз.
Есть у меня файл, допустим 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)сумировало их и выводило эти значения в  новый файл???
Помогите плииз, а то повесят на работе.(((


Содержание

Сообщения в этом обсуждении
"построчная считка значений из файла"
Отправлено allez , 21-Фев-05 13:22 
А пробелы после знака равенства в этом файле, так же как и в примере, то есть, то нет?
Это я к тому, что они могут сделать бяку при разделении строки с помощью 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


"построчная считка значений из файла"
Отправлено Sasha , 21-Фев-05 14:00 
да пробелы то есть то нет.
И использование перла очень критично. А ещё горит конкретно, как говорится нужно было ещё на позавчера



"построчная считка значений из файла"
Отправлено XMan , 21-Фев-05 14:18 
Как вариант:

$var =~ s/\s+//g;
($garbage,$max,$min)=split(/Max\=|Min\=/,$var);


"построчная считка значений из файла"
Отправлено allez , 21-Фев-05 14:32 
#!/usr/bin/perl

open (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\=/,$_);


"построчная считка значений из файла"
Отправлено XMan , 21-Фев-05 17:01 
Встречная поправка для случая, если читается в $_ (например, посредством while (<>)):

s/\s+|\n|\r//g;
($garbage,$max,$min)=split(/Max\=|Min\=/);

PS. \n и \r это на случай, если до этого chomp не делается.


"построчная считка значений из файла"
Отправлено Sasha , 21-Фев-05 17:31 
спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида:
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
Подскажите плиз


"построчная считка значений из файла"
Отправлено Vladimir D Belousov , 25-Фев-05 10:22 
>спасибо, получилось. Правда своими силами. Выводится массив в текстовый файл. такого вида:
>
>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);

Только $/ восстановить надо