2013-03-06 3 views
0

Perl은 오늘 나에게 좋은 점수를 주었고 질문이 있습니다. 다른 perl 스크립트에서 링크를 통해 펄 스크립트에 액세스하고 있습니다. agent.pl?agentid=40서브 루틴에서 사용할 수없는 쿼리 문자열에서 Perl 변수를 설정할 수 있습니다 (일부 서브 루틴에서 사용 가능).

나는 두 가지 방법으로 문제없이 쿼리 문자열을 표시 사용하고있어 agent.pl 스크립트에서

:

my $thatagent = $q->param('agentid'); 
$form{agentid} 

내가의 시작 부분에 어휘 변수를 설정 내 모든 서브 루틴 외부의 스크립트. 그런 다음 $ theagent를 사용하여 스크립트가 실행될 때 HTML을 표시하는 "기본"서브 루틴에 에이전트 ID 번호를 표시합니다. 여기에 어떤 문제도 없습니다.

$dbh->{AutoCommit} = 0; 

my $q = CGI->new; 

my $thatagent = $q->param('agentid'); 

my %form = $q->Vars; 



if (! $q->param("savebtn")) { 
&ViewAgent(); 
exit; 
} 

&UpdateAgent();  

는 또한 문제없이 select 문에 viewagent 서브 루틴 사용 $ 양식에서 두 개의 서브 루틴 {agentid}를 호출합니다.

my $sth = $dbh->prepare("select a.name, a.paidcommission, a.paidreferral, paddy.address1, paddy.address2, paddy.city, paddy.state, paddy.zipcode, maddy.address1, maddy.address2, maddy.city, maddy.state, maddy.zipcode, bc.name, bc.phonenumber, bc.phoneext, bc.phonenumber2, bc.phoneext2, bc.fax, bc.email, sc.name, sc.phonenumber, sc.phoneext, sc.phonenumber2, sc.phoneext2, sc.fax, sc.email from agent a inner join entity e on entityid = agentid inner join address paddy on paddy.addressid = physicaladdressid inner join address maddy on maddy.addressid = mailingaddressid inner join contact bc on bc.contactid = billingcontactid inner join contact sc on sc.contactid = salescontactid where a.agentid = $form{agentid};") or die "prepare statement failed: $DBI::errstr\n"; 

my $sth = $dbh->prepare("select agentid, note, createdt, createuser from agentnote where agentid = $form{agentid};") or die "prepare statement failed: $DBI::errstr\n"; 

이 그런 문제를 제공, 전 세계적으로 (& 위 updateagent)와 $ thatagent를 사용하려고 다른 서브 루틴을 호출하지만 실패합니다. 숫자를 하드 코딩하면 제대로 작동합니다.

sub UpdateAgent { 


my $sth = $dbh->prepare("UPDATE agent SET name=?, paidcommission=?, paidreferral=? WHERE agentid=?;") or die "prepare statement failed: $DBI::errstr\n"; 

$sth->execute($form{'name'}, $form{'paidcommission'}, $form{'paidreferral'}, $thatagent) or die "prepare statement failed: $DBI::errstr\n"; 

$sth->finish; 

} 

나는 내 스크립트의 나머지를 "보고"내 서브 루틴과 분리의 일종이 있어야 느낌이 있지만 확실입니다. 도와주세요! 난 당신이 통해 .pl 파일을 필요에 따라 호출되는 서브 루틴에 컴파일됩니다 mod_perl과 같은 시스템의 어떤 종류에서이 스크립트를 실행하는 추측하고있어

+0

서브 루틴이 * 변수 선언 뒤에 * 정의되어 있습니까? – choroba

+0

예. – kyle

+0

mod_perl이 관련되어 있습니까? – ikegami

답변

0

확인, 그래서 나는

my @thatagent = split(/=/,$ENV{'QUERY_STRING'}); 

my $thatagent = $thatagent[1]; 

을 추가하고 스크립트를 통해 변수를 유지했다.

나는 Perl에 대해 많이 알지 못한다. 그러나 이상하게 보이는 사람. 내가 말했듯이,합니다 (HTML 서브 루틴 호출과 두 개의 서브 루틴) HTML을 표시하는 초기 서브 루틴에서 내가 문제없이 해시로 내 CGI 매개 변수를 읽어 곳에서

$form{agentid} 

을 사용할 수 있었다.

2

: 사전에

감사합니다. 실제 코드는 다음과 같이 찾고 끝 :

여기 발생 updateagent에 의해 사용되는 $의 thatagent 변수가 항상 자동으로 생성 래퍼 invoke_agent_pl 설정은 $ thatagent 변수와 동일하지 않습니다 무엇
sub invoke_agent_pl { 
    ... 
    my $thatagent = ...; 
    ... 

    sub updateagent { 
     ... 
     # do something with $thatagent 
     ... 
    } 
} 

.

가장 쉬운 해결 방법은 이 아니라 my입니다. 스크립트에서 본질적으로 전역 변수 인 것을 사용하지 않는 것이 좋습니다.

+0

저는 아파치, 펄, 그리고 mysql을 사용하여 로컬에서 실행하고 있습니다. 나는 이미 우리의 :-( – kyle

+0

을 사용해 보았는데, 아파치 설정에서 .pl 파일을 실행하는 방법을 보여주고, 문제를 보여주는 실행 가능한 예제를 보여 주었다. – ysth

관련 문제