Update3:
Si te gusta esta publicación, por favor no me votes más sino vota la genial respuesta de DVK a continuación.
tengo los siguientes subprogramas:
use warnings;
#Input
my @pairs = (
"fred bill",
"hello bye",
"hello fred",
"foo bar",
"fred foo");
#calling the subroutine
my @ccomp = connected_component(@pairs);
use Data::Dumper;
print Dumper \@ccomp;
sub connected_component {
my @arr = @_;
my %links;
foreach my $arrm ( @arr) {
my ($x,$y) = split(/\s+/,$arrm);;
$links{$x}{$y} = $links{$y}{$x} = 1;
}
my %marked; # nodes we have already visited
my @stack;
my @all_ccomp;
for my $node (sort keys %links) {
next if exists $marked{$node};
@stack =();
connected($node);
print "@stack\n";
push @all_ccomp, [@stack];
}
sub connected {
no warnings 'recursion';
my $node = shift;
return if exists $marked{$node}; # Line 43
$marked{$node} = 1;
push @stack, $node; # Line 45
my $children = $links{$node}; # Line 46
connected($_) for keys %$children;
}
return @all_ccomp;
}
Pero por qué se da este mensaje:
Variable "%marked" will not stay shared at mycode.pl line 43.
Variable "@stack" will not stay shared at mycode.pl line 45.
Variable "%links" will not stay shared at mycode.pl line 46.
¿Es perjudicial? ¿Error? ¿Cómo puedo arreglar mi código para que se deshaga de ese mensaje?
Update1: puedo actualizar el código que se ejecuta como está con el mensaje de error Actuall
Update2: me trató de modificar el uso de sub como se sugiere DVK. ¡Y funcionó!
use warnings;
#Input
my @pairs = (
"fred bill",
"hello bye",
"hello fred",
"foo bar",
"fred foo");
#calling the subroutine
my @ccomp = connected_component(@pairs);
use Data::Dumper;
print Dumper \@ccomp;
sub connected_component {
my @arr = @_;
my %links;
foreach my $arrm ( @arr) {
my ($x,$y) = split(/\s+/,$arrm);;
$links{$x}{$y} = $links{$y}{$x} = 1;
}
my %marked; # nodes we have already visited
my @stack;
my @all_ccomp;
my $connected_sub;
$connected_sub = sub {
no warnings 'recursion';
my $node = shift;
return if exists $marked{$node};
$marked{$node} = 1;
push @stack, $node;
my $children = $links{$node};
&$connected_sub($_) for keys %$children;
};
for my $node (sort keys %links) { # Line 43
next if exists $marked{$node};
@stack =();
&$connected_sub($node);
#print "@stack\n";
push @all_ccomp, [@stack]; # Line 49
}
return @all_ccomp;
}
No hay 280 líneas en sus fragmentos (gracias a Dios). Debe reproducir el problema en su código de ejemplo y proporcionar los informes de los números de línea en función de lo que proporcione. –