2017-08-07 1 views
0

Im tableau de passage par référence à un sous-programme:Comment manipuler référence de tableau dans sous-programme en perl

my @template_ops; 
handle_templates_with_post_mod(\@template_ops); 

sub handle_templates_with_post_mod 
{ 
    my @my_template_ops = @{$_[0]}; 
    unshift (@my_template_ops), 'O'; 
} 

mais après avoir appelé le sous-programme le tableau encore vide, j'ai essayé:

sub handle_templates_with_post_mod 
{ 
    my $my_template_ops = shift; 
    unshift (@$my_template_ops), 'O'; 
} 

mais Je reçois cette erreur: Can't use string ("...") as an ARRAY ref while "strict refs"

Répondre

4

Quatre questions:

  1. Mettez toujours use strict; use warnings;

  2. Alors unshift (@$my_template_ops), 'O'; aurait produit Useless use of unshift with no values at ./t.pl line 17.. Vous avez défini les parenthèses () incorrect. Soit écrire unshift (@$my_template_ops, 'O'); ou tout simplement les laisser complètement: unshift @$my_template_ops, 'O';

  3. Le code my @my_template_ops = @{$_[0]}; génère une copie de la référence de tableau fourni et vous êtes la manipulation de la copie . Ainsi vous ne voyez pas l'effet au niveau supérieur.

  4. La 2ème version de votre fonction fonctionne parce que vous opérez sur le ref de tableau fourni et que vous la déréférencez pour l'appel unshift.

version de travail:

use strict; 
use warnings; 
use Data::Dumper; 

my @template_ops; 
handle_templates_with_post_mod(\@template_ops); 

print Data::Dumper::Dumper(\@template_ops); 

sub handle_templates_with_post_mod 
{ 
    my $my_template_ops = shift; 
    unshift @$my_template_ops, 'O'; 
} 

Sortie:

$VAR1 = [ 
      'O' 
     ]; 
+0

merci. fonctionne bien –

2

Quand vous donnez le tableau déréférencé un nom, il devient une copie. Pour opérer sur un tableau ref et affecter le tableau original, vous devez soit l'utiliser comme ref, soit le déréférencer sans lui donner un nouveau nom (en utilisant l'opérateur @ pour déréférencer).

my $arrayRef = ...; 
push @{$arrayRef}, 42; 
my $hashRef = ...; 
delete $hashRef->{key}; 
+1

@PerlDuck Merci. Je l'ai changé en hash ref, puisque la suppression des hash est sûre et illustre toujours la syntaxe. – piojo