2013-04-12 11 views
5

Gibt es eine Möglichkeit, zusätzliche Variablen an eine Subroutine für Methodenhandler zu übergeben? Ich mag es generell nicht, globale Variablen außerhalb des Bereichs der Subroutine zu verwenden. Ich habe Dinge wie Datenbankverbindung und Klasseninstanzen, auf die die Handler zugreifen sollen, ohne globale Variablen zu verwenden. Bei Verwendung von debug für die Konsole ist @ @ für jeden Handleraufruf leer.Perl Tänzer - wie übergeben Sie zusätzliche Argumente zu Methoden-Handler-Subroutinen?

#!/usr/bin/perl 

use strict; 

use Dancer; 
use Data::Dumper; 

set('logger' => 'console'); 

my $somevar = SomeClass->new(); 

get('/' => sub{ 
    debug(Dumper(@_)); 
    debug($somevar); 
    return('hello world'); 
}); 

Antwort

3

Eine Möglichkeit ist es, die vars Hash, der Tänzer bietet zu verwenden. Hier verwende ich ein vor Haken eine Datenbank-Handle einzurichten:

use strict; 
use warnings; 
use Dancer; 
use DBI; 

hook 'before' => sub { 
    var dbh => DBI->connect_cached(...); 
}; 

get '/' => sub { 
    my $qry = vars->{dbh}->prepare("SQL"); 
    ... 
    return "Something, something, query results"; 
}; 
+0

Nicht sicher, dass das für meine Anwendung funktioniert. Es sieht so aus, als ob es vor jeder Übereinstimmung vor der Main-Handler-Routine läuft. Einige der Variablen, die ich verwenden möchte, sind ein einmaliges Setup. Sie enthalten Klasseninstanzen, die ich nicht bei jedem http-Methodenaufruf für Tänzer neu initialisieren möchte. Ich wünschte, es gäbe etwas anderes, aber wurde nur einmal genannt. –

+0

Ich habe auch versucht, "Vars" außerhalb des Hakens zu verwenden. Es beschwert sich nicht. Aber der Wert ist nicht innerhalb des Methodenhandlers vorhanden. –

+0

"Nur einmal aufgerufene" und "Klasseninstanzen" klingen so, als ob Sie nur Paketvariablen verwenden möchten. Etwas wie 'our $ dbh = DBI-> connect();', das außerhalb von Handlern deklariert wird. – RickF

0

Mit so etwas wie

sub get_dbh { 
    if (! vars('dbh')) { 
     my $dbh = DBI->connect_cached(...); 
     session(dbh => $dbh); 
    } 
    return vars('dbh'); 
} 

Sie haben Zugriff auf die Datenbank-Handle von überall, ohne sie global ist, wird die Datenbankverbindung nicht hergestellt bis Sie es brauchen und wenn Sie es später in Ihrem Programm noch benötigen, ist es immer noch in der Vars-Sammlung und muss nicht erneut erstellt werden.

Verwandte Themen