OVH Cloud OVH Cloud

programmation objet

1 réponse
Avatar
franck
Bonjour,

J'ai créer la classe suivante:

#!/usr/bin/perl

package monParser;
use HTML::Parser;
@ISA = qw(HTML::Parser);


my $ligne;
my $flag = 0;
my %want = (tag => 'font',
attrs => { face => "Arial", size => "2" });

sub start_handler {
my($tag, $attr) = @_;
return unless $tag eq $want{tag};
foreach my $name ( keys %{$want{attrs}} ) {
return unless $attr->{$name} eq $want{attrs}{$name};
}; $flag = 1;
}

sub new
{
my ($class) = @_;
my $this = $class -> SUPER::new(api_version => 3,
start_h => [\&start_handler, "tagname, attr"],
end_h => [sub {$flag=0 if shift eq $want{tag}},
"tagname"],
text_h => [sub {$ligne.= shift, "\n" if $flag}, "dtext"],
);

$this -> {'LIGNE'} = $ligne;
bless ($this,$class);
return $this;
}

sub affiche
{
my ($this) = @_;
print $this->{'LIGNE'};
}
1;

J'utilise cette classe dans le script:

#!/usr/bin/perl -I /home/Perl/Programmes//module
use monParser;
my $p = monParser->new();
$p->parse_file("\/home\/Perl\/Programmes\/arrivee\/tempo\.txt") || die $!;
$p->affiche;

Je veux afficher l'attribut LIGNE avec la méthode affiche.
Mais ça ne marche pas.
Où est le problème ?

Merci
Franck

1 réponse

Avatar
Ronan Le Hy
franck a écrit:

Je veux afficher l'attribut LIGNE avec la méthode affiche.
Mais ça ne marche pas.


Je crois avoir deviné que "ça ne marche pas" veut dire que rien n'est
affiché. Si j'ai deviné à côté, exprimez-vous plus clairement.
http://www.gnurou.org/documents/smart-questions-fr.html

J'ai créer la classe suivante:
#!/usr/bin/perl

package monParser;
use HTML::Parser;
@ISA = qw(HTML::Parser);


Pas de use warnings; pas de use strict. C'est la première chose à
ajouter quand quelquechose ne "marche pas".

Pour la suite, j'ai une ou deux suggestions non testées.

my $ligne;
my $flag = 0;
my %want = (tag => 'font',
attrs => { face => "Arial", size => "2" });

sub start_handler {
my($tag, $attr) = @_;
return unless $tag eq $want{tag};
foreach my $name ( keys %{$want{attrs}} ) {
return unless $attr->{$name} eq $want{attrs}{$name};
}; $flag = 1;
}

sub new
{
my ($class) = @_;
my $this = $class -> SUPER::new(api_version => 3,
start_h => [&start_handler, "tagname, attr"],
end_h => [sub {$flag=0 if shift eq $want{tag}},
"tagname"],
text_h => [sub {$ligne.= shift, "n" if $flag}, "dtext"],
);

$this -> {'LIGNE'} = $ligne;


Vous initialisez donc $this->{LIGNE} à vide. Et vous ne le mettez jamais
à jour.
Je pense que vous voulez:
text_h => [sub {$this->{LIGNE}.= shift, "n" if $flag}, "dtext"],


bless ($this,$class);
return $this;
}

sub affiche
{
my ($this) = @_;
print $this->{'LIGNE'};
}
1;

J'utilise cette classe dans le script:

#!/usr/bin/perl -I /home/Perl/Programmes//module
use monParser;
my $p = monParser->new();
$p->parse_file("/home/Perl/Programmes/arrivee/tempo.txt") || die $!;


Ces backslashes me paraissent inutiles.

$p->affiche;


HTH

--
Ronan