2013-04-12 33 views
5

Bir yöntem işleyici alt yordamına ek değişkenler iletmenin bir yolu var mı? Genel olarak alt programın kapsamı dışındaki global değişkenleri kullanmayı sevmiyorum. Ben, işleyicilerin globals kullanmadan erişmesini istediğim veritabanı bağlantısı ve sınıf örnekleri gibi şeylerim var. Konsolda hata ayıklamayı kullanarak, her işleyici çağrısı için @_ boş gibi görünüyor.perl dansçısı - yöntem argümanları alt yordamlarına nasıl ek argümanlar iletir?

#!/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'); 
}); 

cevap

3

bir yolu Dansçı sağlar vars karma kullanmaktır. Burada bir veritabanı kolu kurmak için kanca önce kullanın: her yerden küresel olmadan veritabanı sap erişebilir

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

gibi bir şey ile

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

Uygulamam için çalışacağından emin değil. Ana handler rutininden önce her maçta koşmadan önce görülüyor. Kullanmak istediğim değişkenlerden bazıları bir defalık kurulum. Her bir http yöntemi çağrısı üzerine yeniden başlatmak istemediğim sınıf örneklerini içerirler. Keşke böyle bir şey daha olsaydı, ama sadece bir kez çağrıldı. –

+0

Ayrıca çengel dışında "vars" kullanmayı denedim. Bu şikayet etmiyor. Ancak, yöntem işleyicisinin içinde değer yoktur. –

+0

'Sadece bir kez çağrıldı' ve 'sınıf örnekleri' sesi gibi sadece paket değişkenlerini kullanmak isteyebilirsiniz. Herhangi bir işleyicinin dışında bildirilen $ dbh = DBI-> connect(); 'gibi bir şey. – RickF

0

, veritabanı bağlantısı yapılmaması İhtiyacınız olana kadar ve daha sonra programınıza tekrar ihtiyacınız varsa, yine de vars koleksiyonundadır ve tekrar oluşturulmasına gerek yoktur.