Kai Diefenbach: Negation von Patterns

Beitrag lesen

Gude Steve,

#######################################################
$html =~ s/<img.*src="(/fb[\S|.]*(gif))"/push (@v,$1);/egmi;
#######################################################

Soweit ist alles ok, aber nun moechte ich alle, in dieser Art verlinkten Dateien, welche nicht die Endung .gif haben.

HTML solltest du immer mit Hilfe von HTML::Parser o.ä. parsen; auf diese Weise verarbeitest du das HTML nicht nur ordentlich, sondern du kommst auch sehr bequem an die einzelnen Dateinamen heran - ohne auf das HTML drumherum achten zu müssen.

Ein Beispiel:

#!/usr/bin/perl -w
use strict;
use HTML::Parser;

my $parser = MyParser->new();
$parser->parse_file('path/to/filename');

package MyParser;
use base qw(HTML::Parser);

sub start
{
   my (undef, $tag, $attr) = @_;
   if ($tag eq 'img') {print $attr->{src}};
}

perldoc HTML::Parser

Zu deiner ursprünglichen Frage:

Du könntest die RegExp aufteilen:
push @non_gif, $filename if $filename =~ m(^/fb) && $filename !~ /gif$/;
oder: "negative look-behind assertion" verwenden.
push @non_gif, $filename if $filename =~ m|^/fb.*(?<!gif)$|;

perldoc perlre

Eine Lösung lässt sich allerdings auch "nur" mit substr finden.
perldoc -f substr

ad,
kd.