OVH Cloud OVH Cloud

aide sur les pointeurs

3 réponses
Avatar
julien
Bonjour
Je souhaite utiliser des pointeurs dans 2 sous-programmes. Voici un
exemple d'utilisation de poiteurs sur des scalaires que j'ai trouvé:
&A();

sub B()
{
print $$referencetexte, "\n"; # valeur n'est plus contenue que dans la
référence!
}

sub A()
{
my $Texte = "Voici un petit texte";
$referencetexte = \$Texte; # Ici est définie une référence
&B();
}

J'ai essayé de l'adapter pour faire un pointeur sur un tableau. Cela donne:
sub language {
my $lang = shift;
my $html = shift;
my @conf = shift;

my @html;
my $parse = \@html; # Ici est définie une référence

my $tree = HTML::TreeBuilder->new;

$tree->warn(1);
$tree->implicit_body_p_tag(1);
$tree->parse($html);

my $ref_array = $tree->{_content};
for my $htmlElt (@{$ref_array}) {
printHtmlElt($htmlElt);
}

$tree->delete;
}

sub printHtmlElt {
my $elt = shift;
my $ref = shift || "";

if (ref $elt) {
my %attributes=$elt->all_external_attr;
while((my $cle, my $valeur)=each(%attributes)) {
push(@$parse,"blabla");
}

foreach my $item ($elt->content_list) {
if (ref $item) {
printHtmlElt($item,$ref.".".$elt->{_tag});
}
else {
if (length($item)>1) {
push(@$parse,"blabla");
}
}
}
}
}

J'ai un message à propos de push(@$parse,"blabla"); (j'ai mis use strict
et use warnings dans mon programme): global symbol "$parse" requires
explicit package name, erreur qui se produit d'habitude quand j'oublie
de délcaler une variable par my $variable;

Comment puis-je modifier ma déclaration de pointeur pour que cela
fonctionne?

Merci
Julien

3 réponses

Avatar
tiscali
$toto=1;
print $toto; # $toto = 1
&func($toto); # le "&" est facultatif
# "$var" est la referance de la variable
print $toto; # $toto = 5
sub func{
$titi=shift; # referance de $toto
$$titi=5; # remplacer le contenu de $toto par 5
# "$$var" est le contenu de la variable
# pointe par $var
}

c egalement valable pour les tableau, tableau associatif, et les fonction


julien wrote:
Bonjour
Je souhaite utiliser des pointeurs dans 2 sous-programmes. Voici un
exemple d'utilisation de poiteurs sur des scalaires que j'ai trouvé:
&A();

sub B()
{
print $$referencetexte, "n"; # valeur n'est plus contenue que dans la
référence!
}

sub A()
{
my $Texte = "Voici un petit texte";
$referencetexte = $Texte; # Ici est définie une référence
&B();
}

J'ai essayé de l'adapter pour faire un pointeur sur un tableau. Cela donne:
sub language {
my $lang = shift;
my $html = shift;
my @conf = shift;

my @html;
my $parse = @html; # Ici est définie une référence

my $tree = HTML::TreeBuilder->new;

$tree->warn(1);
$tree->implicit_body_p_tag(1);
$tree->parse($html);

my $ref_array = $tree->{_content};
for my $htmlElt (@{$ref_array}) {
printHtmlElt($htmlElt);
}

$tree->delete;
}

sub printHtmlElt {
my $elt = shift;
my $ref = shift || "";

if (ref $elt) {
my %attributes=$elt->all_external_attr;
while((my $cle, my $valeur)êch(%attributes)) {
push(@$parse,"blabla");
}

foreach my $item ($elt->content_list) {
if (ref $item) {
printHtmlElt($item,$ref.".".$elt->{_tag});
}
else {
if (length($item)>1) {
push(@$parse,"blabla");
}
}
}
}
}

J'ai un message à propos de push(@$parse,"blabla"); (j'ai mis use strict
et use warnings dans mon programme): global symbol "$parse" requires
explicit package name, erreur qui se produit d'habitude quand j'oublie
de délcaler une variable par my $variable;

Comment puis-je modifier ma déclaration de pointeur pour que cela
fonctionne?

Merci
Julien



Avatar
tiscali
tiscali wrote:
$toto=1;
print $toto; # $toto = 1
&func($toto); # le "&" est facultatif
# "$var" est la referance de la variable
print $toto; # $toto = 5
sub func{
$titi=shift; # referance de $toto
$$titi=5; # remplacer le contenu de $toto par 5
# "$$var" est le contenu de la variable
# pointe par $var
}



la declaration de $parse n'est pas faite dans la fonction
"printHtmlElt".


c egalement valable pour les tableau, tableau associatif, et les fonction


julien wrote:

Bonjour
Je souhaite utiliser des pointeurs dans 2 sous-programmes. Voici un
exemple d'utilisation de poiteurs sur des scalaires que j'ai trouvé:
&A();

sub B()
{
print $$referencetexte, "n"; # valeur n'est plus contenue que dans
la référence!
}

sub A()
{
my $Texte = "Voici un petit texte";
$referencetexte = $Texte; # Ici est définie une référence
&B();
}

J'ai essayé de l'adapter pour faire un pointeur sur un tableau. Cela
donne:
sub language {
my $lang = shift;
my $html = shift;
my @conf = shift;
my @html;
my $parse = @html; # Ici est définie une référence
my $tree = HTML::TreeBuilder->new;

$tree->warn(1);
$tree->implicit_body_p_tag(1);
$tree->parse($html);

my $ref_array = $tree->{_content};
for my $htmlElt (@{$ref_array}) {
printHtmlElt($htmlElt);
}

$tree->delete;
}
sub printHtmlElt {
my $elt = shift;
my $ref = shift || "";
if (ref $elt) {
my %attributes=$elt->all_external_attr;
while((my $cle, my $valeur)êch(%attributes)) {
push(@$parse,"blabla");
}
foreach my $item ($elt->content_list) {
if (ref $item) {
printHtmlElt($item,$ref.".".$elt->{_tag});
}
else {
if (length($item)>1) {
push(@$parse,"blabla");
}
}
}
}
}

J'ai un message à propos de push(@$parse,"blabla"); (j'ai mis use
strict et use warnings dans mon programme): global symbol "$parse"
requires explicit package name, erreur qui se produit d'habitude quand
j'oublie de délcaler une variable par my $variable;

Comment puis-je modifier ma déclaration de pointeur pour que cela
fonctionne?

Merci
Julien






Avatar
julien
tiscali wrote:
$toto=1;
print $toto; # $toto = 1
&func($toto); # le "&" est facultatif
# "$var" est la referance de la variable
print $toto; # $toto = 5
sub func{
$titi=shift; # referance de $toto
$$titi=5; # remplacer le contenu de $toto par 5
# "$$var" est le contenu de la variable
# pointe par $var
}

c egalement valable pour les tableau, tableau associatif, et les fonction
Merci, cet example plus simple m'a permis de régler mon problème pour

les tableaux. Voici le même programme pour les pointeurs de tableaux, au
cas où ça intéresse quelqu'un:
my @toto=("1","2");
print @toto;
print "n"; # @toto = 1 2
&func(@toto); # le "&" est facultatif
# "$var" est la referance de la variable
print @toto;
print "n"; # @toto = 1 2 3 4


sub func{
my $titi=shift; # referance de @toto
$$titi[2]="3"; # remplacer le contenu de $toto par 5
push(@$titi,"4"); # "$$var" est le contenu de la variable
# pointe par $var
}

Julien