2010-07-22 4 views
2

J'ai un fichier texte, et une fonction pour récupérer à partir de ce fichier texte:fonction Perl sachant type de récepteur

@thefile = read_file('somepathfile'); 

Je voudrais avoir une application différente de la fonction read_file selon le type reçoit la information.

Donc, si je vous écris:

%thefile = read_file('somepathfile'); 

alors une autre fonction sera exécutée.

Comment faire cela?

Répondre

6

Jetez un oeil à Want ou Contextual::Return Modules CPAN.

Ci-dessous un exemple simple en utilisant Want:

use strict; 
use warnings; 
use Want; 

sub read_file { 
    my $filepath = shift; 
    my @file_contents = get_file_contents($filepath); 

    return @file_contents if want('LIST'); 

    return { 
     filepath => $filepath, 
     content => \@file_contents, 
     lines => scalar @file_contents 
    } if want('HASH'); 

    die "Nothing for that context!"; 
} 

my @list = read_file('foo'); 
my %hash = %{ read_file('foo') }; 

NB. Le déréférencement de hachage est nécessaire pour forcer le contexte de retour.

/I3az/

+0

est-il possible de le faire sans les appels de hachage% {} autour? –

+0

c'est une solution, une solution sous-optimale mais néanmoins une solution. –

+1

Pas vraiment. Perl ne comprend que les contextes scalaire, liste ou vide, donc Dieu sait quels sont les obstacles que doit traverser le module. Personnellement, je préfère être plus implicite dans mes contextes et opter pour quelque chose comme la réponse de Sinan ou peut-être un objet. par exemple. MyFile-> read ('file.txt') -> as_list (voir gist: http://gist.github.com/487366) – draegtun

12

Alors que draegtun's answer illustre une technique agréable, je vais recommander la clarté. Par exemple:

@thefile = read_file_lines('somepathfile'); 

%thefile = read_file_pairs('somepathfile'); 
+0

Pour le dire plus directement: Ne pas synthétiser un nouveau contexte de "hachage" au-dessus des contextes scalaire/liste/vide que Perl a déjà. C'est un-perlish et va embrouiller les gens. –

+0

oui mais l'objectif initial était d'utiliser une seule fonction pour lire le fichier. la fonction trouverait alors ce qui est reçu et agirait en conséquence. –

Questions connexes