Perl解析url以获取值

use*_*172 5 url perl parsing uri

如何使用URI :: URL perl模块从此链接获取参数"code"的值:http://www.someaddress.com/index.html? test = value&code = INT_12345可以使用URI :: URL完成或URI(我知道第一个是过时的).提前致谢.

pma*_*olm 9

创建一个URI对象并使用该query_form方法获取查询的键/值对.如果你知道代码参数只指定了一次,你可以这样做:

my $uri   = URI->new("http://www.someaddress.com/index.html?test=value&code=INT_12345");
my %query = $uri->query_form;

print $query{code};
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用URI :: QueryParam,它将soem aditional方法添加到URI对象:

my $uri = URI->new("http://www.someaddress.com/index.html?test=value&code=INT_12345");
print $uri->query_param("code");
Run Code Online (Sandbox Code Playgroud)


okl*_*las 6

use URI;
my $uri   = URI->new("http://someaddr.com/index.html?test=FIRST&test=SECOND&code=INT_12345");
my %query = $uri->query_form;
use Data::Dumper;
print Dumper \%query;
Run Code Online (Sandbox Code Playgroud)

我们可以看到:

   $VAR1 = {
              'test' => 'SECOND',
              'code' => 'INT_12345'
            };
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个结果是错误的。

有可能的解决方案:

use URI::Escape;

sub parse_query {
   my ( $query, $params ) = @_;
   $params ||= {};
   foreach $var ( split( /&/, $query ) ){
     my ( $k, $v ) = split( /=/, $var );
     $k = uri_unescape $k;
     $v = uri_unescape $v;
     if( exists $params->{$k} ) {
        if( 'ARRAY' eq ref $params->{$k} ) {
           push @{ $params->{$k} }, $v;
        } else {
           $params->{$k} = [ $params->{$k}, $v ];
        }
     } else {
        $params->{$k} = $v;
     }
   }
   return $params;
}
Run Code Online (Sandbox Code Playgroud)