Как извлечь числовые данные из текстового файла?

Я хочу, чтобы скрипт Perl извлекал данные из текстового файла и сохранял их как другой текстовый файл. Каждая строка текстового файла содержит URL-адрес jpg, например " http://pics1.riyaj.com/thumbs/000/082/104//small.jpg ". Я хочу, чтобы скрипт извлекал последние 6 чисел каждого jpg URL (т.е. 082104) в переменную. Я хочу, чтобы переменная была добавлена ​​в другое место в каждой строке нового текста.

Введите текст:

text http://pics1.riyaj.com/thumbs/000/082/104/small.jpg text
text http://pics1.riyaj.com/thumbs/000/569/315/small.jpg text

Вывод текста:

text php?id=82104 text
text php?id=569315 text 

Спасибо

12.12.2008 06:22:43
Есть ли у вас какие-то особые проблемы с написанием этого самостоятельно? Кроме того, всегда ли URL-адреса имеют форму, которую вы описали, или вам нужно иметь возможность обрабатывать произвольные URL-адреса?
mweerden 12.12.2008 07:37:54
2 ОТВЕТА

что ты уже испробовал?

Вот короткая программа, которая дает вам суть проблемы, и вы можете добавить все остальное:

пока( )
    {
    s | Http:.? //.*/ \ d + / (\ d +) / (\ d +) * JPG | PHP ID = $ 1 $ 2 |;
    Распечатать;
    }

Это очень близко к программе командной строки, которая обрабатывает зацикливание и печать для вас с помощью -pпереключателя (подробности см. В документации perlrun ):

perl -pi.old -e 's|http://.*/\d+/(\d+)/(\d+).*?jpg|php?id=$1$2|' inputfile > outputfile
2
12.12.2008 07:40:01

Я не знал, отвечать ли в соответствии с тем, что вы описали («последние 6 цифр»), или просто предполагать, что все это соответствует шаблону, который вы показали. Поэтому я решил ответить на оба вопроса.

Вот метод, который может обрабатывать строки более разнообразные, чем ваши примеры.

use FileHandle;

my $jpeg_RE = qr{
    (.*?)           # Anything, watching out for patterns ahead
    \s+             # At least one space
    (?> http:// )   # Once we match "http://" we're onto the next section
    \S*?            # Any non-space, watching out for what follows
    ( (?: \d+ / )*  # At least one digit, followed by a slash, any number of times
      \d+           # another group of digits
    )               # end group
    \D*?            # Any number of non-digits looking ahead
    \.jpg           # literal string '.jpg'
    \s+             # At least one space
   (.*)             # The rest of the line
}x;

my $infile  = FileHandle->new( "<$file_in" );
my $outfile = FileHandle->new( ">$file_out" );

while ( my $line = <$infile> ) { 
    my ( $pre_text, $digits, $post_text ) = ( $line =~ m/$jpeg_RE/ );
    $digits        =~ s/\D//g;
    $outfile->printf( "$pre_text php?id=%s $post_text\n", substr( $digits, -6 ));
}
$infile->close();

Однако, если это так же регулярно, как вы показываете, это становится намного проще:

use FileHandle;
my $jpeg_RE = qr{
    (?> \Qhttp://pics1.riyaj.com/thumbs/\E ) 
    \d{3}
    /
    ( \d{3} )
    / 
    ( \d{3} )
    \S*?
    \.jpg
}x;

my $infile  = FileHandle->new( "<$file_in" );
my $outfile = FileHandle->new( ">$file_out" );

while ( my $line = <$infile> ) { 
    $line =~ s/$jpeg_RE/php?id=$1$2/g;
    $outfile->print( $line );
}
$infile->close();
1
12.12.2008 08:04:12