如何从URL获取查询字符串 - perl

时间:2014-07-29 11:28:44

标签: perl query-string

我不知道如何使用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
}

3 个答案:

答案 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_INFOPoet+MasonMojolicious和许多其他框架,或者这里是用于处理路径的独立模块。 (搜索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模块。

http://search.cpan.org/dist/URI/lib/URI/URL.pm

答案 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);