2012-06-28 3 views
0

그래,이 질문은 당분간 저를 괴롭 혔습니다. 데이터베이스에 연결하고 쿼리의 값을 반환하는 모듈을 실행하고 있습니다. 모듈을 호출하고 모듈의 서브 루틴에서 값을 반환하려고하는 스크립트가 있습니다. 코드는 말보다 더 나은이기 때문에하지만, 여기에 내가 가진 무엇 :모듈 perl에서 해시를 반환하는 방법

내 모듈의
sub selectCustomerName ($code){ 
    connectDB() or die "Failed in subroutine"; 
    #Selects customer name from customer table where code is $code 
    my $selectName = "SELECT * FROM customers WHERE code = ?"; 
    my $sth = $dbh->prepare($selectName); 
    $sth->execute($code); 
my $hash = $sth->fetchrow_hashref; 
$hash->{customer_name} = $name; 
return $name; 
$sth ->finish(); 
$dbh->disconnect(); 
} 

, 여기 내 스크립트입니다 : 변수를 장난과 스위칭을 많이에서

#!/usr/bin/perl 
require Connect; 
use warnings; 
my $dbh = Connect::connectDB(); 
my $results = Connect::selectCustomerName('38d'); 
print $results; 

나는 인쇄에있어 0 및 해시 참조는 있지만 해시의 실제 값은 아닙니다. 어떤 도움이라도 대단히 감사 할 것입니다!

답변

1

몇 가지 실수가 있습니다. 이 시도 :

use strict; use warnings; # never forget this 2 pragmas 
use Data::Dumper; # print what's inside data structures or object 

sub selectCustomerName { 
    my $code = shift; # or my ($code) = @_; 

    connectDB() or die "Failed in subroutine"; 
    #Selects customer name from customer table where code is $code 
    my $selectName = "SELECT * FROM customers WHERE code = ?"; 
    my $sth = $dbh->prepare($selectName); 
    $sth->execute($code); 
    my $hash = $sth->fetchrow_hashref; 
    print Dumper $hash; 
    $name = $hash->{customer_name}; 
    $sth ->finish(); 
    $dbh->disconnect(); 
    return $name; 
} 
  • 을 당신이 returnfinish() & disconnect()를 넣어 경우, 그들은 호출되지 않습니다.
+1

[펄 프로토 타입 (http://perldoc.perl.org/perlsub.html#Prototypes) ('하위 selectCustomerName ($ 코드) {')이 아니라 구문 오류,하지만를 지정하는 방법 메소드가 기대하는 인수. 그러나 다른 많은 프로그래밍 언어와 달리 매개 변수는 자동으로 채워지지 않습니다. 예를 들어'shift '를 사용하여 매개 변수를'@ _'에서 꺼내야합니다. – Konerak

+0

빠른 응답을 보내 주셔서 감사합니다. 그래도 인쇄 문제는 계속 발생합니다. 그것은 내 스크립트에서 "인쇄에서 초기화되지 않은 값 사용"을 제공합니다. 그러면 반환되는 것에 문제가 있다고 생각하게됩니다. 어떤 아이디어입니까? –

+0

당신은'$ hash -> {customer_name} = $ name; 대신에'my $ name = $ hash -> {customer_name}'을 사용합니다. – Konerak

0

실제로 가장 가까운 방법은 아마도 Data::Dumper입니다.

#!/usr/bin/perl 

use strict; 
use warnings; 

require Connect; 
use Data::Dumper; 

my $dbh = Connect::connectDB(); 
my $results = Connect::selectCustomerName('38d'); 
print Dumper $results; 

하지만 해시 레퍼런스가 있다면 당신은 %{$hash_ref}를 사용하여 복종 할 수 있으며, 다른 해시를 사용로 사용합니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

require Connect; 

my $dbh = Connect::connectDB(); 
my $results = Connect::selectCustomerName('38d'); 

foreach (keys %{$results}) { 
    say "Key: $_, Value: $results->{$_}"; 
} 
+0

Dumper는 확실히 쉽지만 다른 방법을 사용하여 포맷하는 것이 더 쉬워 보입니다. 그리고 나는 많은 시도 중 하나에서 역 참조를 시도했지만 아무것도 인쇄하지 않았습니다. 아마 내 모듈 코드의 오류 때문입니다. –