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

Исходное сообщение
"Вытащить строку из файла"

Отправлено ALUM , 05-Июн-08 13:10 
open FN, "$Epr_file_name" || die "Файл не найден!";
foreach( <FN> )
{ $Wget_epr .= $_; }
close FN;

теперь надо найти в $Wget_epr подстроку "Software realese 3.0.0" и взять только цифры с точками.

помогите пожалуйста, моск рушится


Содержание

Сообщения в этом обсуждении
"Вытащить строку из файла"
Отправлено Mil , 05-Июн-08 13:29 
>open FN, "$Epr_file_name" || die "Файл не найден!";
>foreach( <FN> )
>{ $Wget_epr .= $_; }
>close FN;
>
>теперь надо найти в $Wget_epr подстроку "Software realese 3.0.0" и взять только
>цифры с точками.
>
>помогите пожалуйста, моск рушится

if ($Wget_epr=~m/Software\srealese\s([\d.]+)/) {
  print "найдено $1\n";
} else {
  print "не найдено\n";
}

---
а вообще Perl -- зло :-)


"Вытащить строку из файла"
Отправлено ALUM , 05-Июн-08 13:41 
>[оверквотинг удален]
>>помогите пожалуйста, моск рушится
>
>if ($Wget_epr=~m/Software\srealese\s([\d.]+)/) {
>  print "найдено $1\n";
>} else {
>  print "не найдено\n";
>}
>
>---
>а вообще Perl -- зло :-)

не ловит.

пример файла:

    <TD height="24" COLSPAN=1 align=right background="imagesnavi/topbg3.gif" align="right" class="header">
 DVD Rel. 20  - Software release 4.1.0   </TD>


"Вытащить строку из файла"
Отправлено Mil , 05-Июн-08 15:17 
>[оверквотинг удален]
>>
>>---
>>а вообще Perl -- зло :-)
>
>не ловит.
>
>пример файла:
>
>    <TD height="24" COLSPAN=1 align=right background="imagesnavi/topbg3.gif" align="right" class="header">
> DVD Rel. 20  - Software release 4.1.0   </TD>

так вы определитесь, что вам надо искать release или realese и ищите именно это :-)


"Вытащить строку из файла"
Отправлено ALUM , 05-Июн-08 16:36 
>[оверквотинг удален]
>>
>>не ловит.
>>
>>пример файла:
>>
>>    <TD height="24" COLSPAN=1 align=right background="imagesnavi/topbg3.gif" align="right" class="header">
>> DVD Rel. 20  - Software release 4.1.0   </TD>
>
>так вы определитесь, что вам надо искать release или realese и ищите
>именно это :-)

дело не в неправильном написании, эту ошибку я сразу просёк, за идиота не держите.


"Вытащить строку из файла"
Отправлено andy , 06-Июн-08 06:52 
[red@mail ~/dev/perl/re]$ ls -l
total 4
-rwxr-xr-x  1 red  red  475  6 июн 10:43 on20080606
-rw-r--r--  1 red  red  163  6 июн 10:41 on20080606.txt
[red@mail ~/dev/perl/re]$
[red@mail ~/dev/perl/re]$ cat ./on20080606
#!/usr/bin/perl
use strict;
use warnings;
use vars qw( $text $release );
sub get_release($);

open(F, '<', 'on20080606.txt') or die($!); $text.= $_ while <F>; close(F);

if( defined( $release = get_release($text) ) ) {
    printf "found release %s\n", $release;
} else {
    printf "nothing found\n";
}

sub get_release($) {
    my($text, $release);
    $text = shift;
    ( $release ) = $text =~ / \b software \s+ release \s+ (\d[a-z0-9.]*) \b /gxis;
    return $release;
}
[red@mail ~/dev/perl/re]$
[red@mail ~/dev/perl/re]$
[red@mail ~/dev/perl/re]$ cat ./on20080606.txt
   <TD height="24" COLSPAN=1 align=right
   background="imagesnavi/topbg3.gif" align="right" class="header">
DVD Rel. 20  - Software
release 11.Pre4</TD>
gfwd
[red@mail ~/dev/perl/re]$
[red@mail ~/dev/perl/re]$ ./on20080606
found release 11.Pre4
[red@mail ~/dev/perl/re]$


>а вообще Perl -- зло :-)

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


"Вытащить строку из файла"
Отправлено madskull , 06-Июн-08 10:17 
че-та как-то много всего...

open F,"<file" or die $!;
($_=join "",<F>)=~s/^.+software\s+release\s+(.+?)\s.+/$1/si;
print;

Хотя, если в целях обучения... все равно много :)


"Вытащить строку из файла"
Отправлено angra , 06-Июн-08 10:36 
Вы это проверяли хоть? Проверьте на строке:
software release 1.23
То есть без лишних символов в начале и одиночного пробельного и произвольных дальше в конце. Я бы сказал что ваш регекс нежизнеспособен, слишком специфические условия ему подавай.  
Но даже если хочется короче, то я бы все-таки предпочел:
open F,"<a" or die $!;map {print "$1\n" if /software\s+release\s+([\d.]+)/i} <F>
Хотя еще правильней было бы использовать такой:
open F,"<a" or die $!;foreach (<F>) {print "$1\n" if /[Ss]oftware\s+[Rr]elease\s+([\d.]+)/}
Данный вариант не ест лишней памяти и будет нормально работать на больших файлах, также избавлен от проблем со скоростью у /i.

"Вытащить строку из файла"
Отправлено madskull , 06-Июн-08 12:33 
>Вы это проверяли хоть? Проверьте на строке:
>software release 1.23
>То есть без лишних символов в начале и одиночного пробельного и произвольных
>дальше в конце. Я бы сказал что ваш регекс нежизнеспособен, слишком
>специфические условия ему подавай.

Конечно проверял. На том примере, чтобыл дан - работает.
Да я и не ставил целью сделать что-то универсальное. Есть задача - есть решение.
Если бы мне понадобилось выдрать что-то из файла, я бы сделал примерно так, однострочником и не задумываяь о памяти, скорости и тому подобном.
Мало того, я бы даже не стал заморачиваться с открытием файла, а сделал бы что-то вроде
perl -wlne '/Software release (.+?) / && print $1' file

И вообще, я не регексп демонстрировал, а то, что можно сделать намного короче.


"Вытащить строку из файла"
Отправлено vg , 05-Июн-08 16:11 
>[оверквотинг удален]
>>>помогите пожалуйста, моск рушится
>>
>>if ($Wget_epr=~m/Software\srealese\s([\d.]+)/) {
>>  print "найдено $1\n";
>>} else {
>>  print "не найдено\n";
>>}
>>
>>---
>>а вообще Perl -- зло :-)

man perlre