open FN, "$Epr_file_name" || die "Файл не найден!";
foreach( <FN> )
{ $Wget_epr .= $_; }
close FN;теперь надо найти в $Wget_epr подстроку "Software realese 3.0.0" и взять только цифры с точками.
помогите пожалуйста, моск рушится
>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 -- зло :-)
>[оверквотинг удален]
>>помогите пожалуйста, моск рушится
>
>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>
>[оверквотинг удален]
>>
>>---
>>а вообще 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 и ищите именно это :-)
>[оверквотинг удален]
>>
>>не ловит.
>>
>>пример файла:
>>
>> <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 и ищите
>именно это :-)дело не в неправильном написании, эту ошибку я сразу просёк, за идиота не держите.
[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 -- зло :-)любой инструмент или неудобен или опасен, если не читать мануалы к нему (ни к кому лично фраза не относится, просто комментарий)
че-та как-то много всего...open F,"<file" or die $!;
($_=join "",<F>)=~s/^.+software\s+release\s+(.+?)\s.+/$1/si;
print;Хотя, если в целях обучения... все равно много :)
Вы это проверяли хоть? Проверьте на строке:
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.
>Вы это проверяли хоть? Проверьте на строке:
>software release 1.23
>То есть без лишних символов в начале и одиночного пробельного и произвольных
>дальше в конце. Я бы сказал что ваш регекс нежизнеспособен, слишком
>специфические условия ему подавай.Конечно проверял. На том примере, чтобыл дан - работает.
Да я и не ставил целью сделать что-то универсальное. Есть задача - есть решение.
Если бы мне понадобилось выдрать что-то из файла, я бы сделал примерно так, однострочником и не задумываяь о памяти, скорости и тому подобном.
Мало того, я бы даже не стал заморачиваться с открытием файла, а сделал бы что-то вроде
perl -wlne '/Software release (.+?) / && print $1' fileИ вообще, я не регексп демонстрировал, а то, что можно сделать намного короче.
>[оверквотинг удален]
>>>помогите пожалуйста, моск рушится
>>
>>if ($Wget_epr=~m/Software\srealese\s([\d.]+)/) {
>> print "найдено $1\n";
>>} else {
>> print "не найдено\n";
>>}
>>
>>---
>>а вообще Perl -- зло :-)man perlre