我不知道如何使用Perl从URL中获取查询字符串。我尝试了几种方法,例如:
my $qs = $ENV{'QUERY_STRING'};
my @d = split(/&/, $qs);
if ( $d[1] eq 'reports' ) {
... do something
}
和
use CGI;
my $q = CGI->new;
my $page = $q->param('page');
但我没有得到钥匙的价值。现在我手动放入查询字符串,即project.local/routes.cgi?page=reports
,但我从命令行获得以下内容:
Use of uninitialized value $qs in split at ./routes.cgi line 23.
Use of uninitialized value $d[1] in string eq at ./routes.cgi line 25.
我不确定为什么会出现这种警告,因为如果它不存在它应该是unf?
我应该如何存储和检查查询字符串变量?我主要使用routes.cgi脚本作为路由控制器,其中所有链接指向<a href="project.local/routes.cgi?page=xx">
,然后我处理模板工具包文件并重定向到该页面(好的概念?)
诊断结果:
Use of uninitialized value $qs in split at ./routes.cgi line 23 (#1)
(W uninitialized) An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.
修改
use URI qw( );
use URI::QueryParam qw( );
my $u = URI->new($base_url);
my ($p) = $u->query_param('page');
if ( $p eq 'reports' ) {
...do something
}
答案 0 :(得分:2)
伙计,你和你的route.cgi
打了很多天(基于你过去的问题)。通过阅读过去问题中的评论和答案,许多开发人员已经对您说过:使用一些框架。
现在提出您的问题:
Use of uninitialized value $qs in split at ./routes.cgi line 23.
这意味着(按行,use diagnostics
说的内容) - $qs
变量不包含任何值。为什么$ENV{'QUERY_STRING'};
没有值取决于您的环境,但通常,您不应该依赖某些环境变量,而应该依赖于您从HTTP请求获得的内容。
Use of uninitialized value $d[1] in string eq at ./routes.cgi line 25.
当然,因为$qs
未定义,split
分裂什么都没有,而且分裂的东西也没什么 - 所以你没有得到@d
数组的任何内容,因此{ {1}}未初始化。
$d[1]
时(正如你在一个问题中所说的那样),你应该知道,而不是在php-word
成功分裂“QUERY_STRING”后你会得到至&
值$d[0]
,而不仅仅是page=report
。
正如@AndyLester告诉你的那样,处理URL(获取或编写)的部分是URI :: URL模块,但你真的应该至少阅读它的描述。
广告路线:通常会有更好,更好,更友好的SEO,如下所示:
report
而不是
http://example.com/blog/archive/2013/12/20
因此,对于“路线”,请不要使用网址参数,而应使用http://example.com/run?section=blog&action=archive&year=2014&month=12&day=20
。这种“哲学”已经发展成许多框架,如PATH_INFO
,Poet+Mason
,Mojolicious
和许多其他框架,或者这里是用于处理路径的独立模块。 (搜索MetaCPAN.org)。
从我的角度来看,perl web-app开发基于下一个命令:
安装我自己的perl环境(只需要一次)
Dancer
获得我的“自己的”perl
curl -L http://install.perlbrew.pl | bash
#relog, to init the environment
perlbrew available
prelbrew install perl-5.20.0
prelbrew switch perl-5.20.0
prelbrew install-cpanm
从现在起,事情相对简单:
cpanm Poet #will install a bunch of modules
#or alternatively
cpanm Mojolicious
你有一个正在运行的perl web应用程序。因此,请将浏览器指向:cd my_development_directory
poet new myapp
cd myapp
echo 'This is my report <% localtime %>' > comps/report.mc
./bin/run.pl
并获取
http://localhost:5000/report
并且您将获得一个很棒的调试面板以及更多...(参见Mason&amp; Poet手册)
我仍然是perl开发的初学者,所以其他更有经验的perl-monks可以给你更好的建议。
答案 1 :(得分:1)
您想使用URI :: URL模块。
答案 2 :(得分:-1)
jm666是正确的,你真的应该考虑使用一个框架。但是,如果您希望将模块安装保持在最低限度,请尝试这样的操作......
use strict;
use warnings;
use URI::Escape;
use Data::Dumper;
#this will catch anything after the "?", as in SomeURL?Var=111&OtherVar=QQQ
my $RequestHash;
if($ENV{"QUERY_STRING"}) {
#QUERY_STRING="id=demo:5&other=some%20text&last=more%20text"
my @TempArray=split("&", $ENV{"QUERY_STRING"});
foreach my $item (@TempArray) {
my ($Key, $Value)=split("=", uri_unescape($item)); #need to fix this to work with more than one "=" in the value
$RequestHash->{lc($Key)}=$Value; #normalize the key name to lower case - because you never know what users will do
} #end foreach
} #end query check if
print Data::Dumper::Dumper($RequestHash);