я не знаю, стоит ли отвечать согласно тому, что вы описали («последние 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();
Является ли их какой-либо конкретной проблемы, вы должны с написания его самостоятельно? Кроме того, всегда ли указаны URL-адреса формы, которую вы описали, или вам нужно иметь возможность обрабатывать произвольные URL-адреса? – mweerden 2008-12-12 07:37:54