我使用正则表达式将URI提取到Perl变量中。我现在需要提取一部分内容。
例如,假设$2
包含URI部分,URI可能有也可能没有查询参数,即格式为/aaa/bbb/ccc/ddd/eee
或/aaa/bbb/ccc?eee=true&fff=false
我想根据Perl程序收到的参数提取前N个斜杠。例如,最多/aaa/bbb
或/aaa/bbb/ccc
。
我遇到的问题是第三个斜杠之后的部分可能有也可能没有查询参数。
如果查询参数存在,如何忽略它们?
答案 0 :(得分:1)
使用URI处理URI:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use URI;
for my $string (qw( /aaa/bbb/ccc/ddd/eee
/aaa/bbb/ccc?eee=true&fff=false
)) {
my $uri = 'URI'->new($string);
my @path = $uri->path_segments;
for my $length (1 .. @path - 1) {
say join "\t", $uri, $length, join '/', @path[ 0 .. $length ];
}
}
答案 1 :(得分:1)
这会按照你的要求行事。它使用URI
模块,并从每个URL字符串构建一个对象,以便可以使用方便的方法来操作内容
首先使用$url->query(undef)
删除查询。然后将路径拆分为@path
中的段列表,并将该列表截断为所需的长度
结果将变回字符串并返回
该程序从您提供的每个网址中提取一段,两段和三段路径作为示例
use strict;
use warnings 'all';
use feature 'say';
use URI;
my $url1 = '/aaa/bbb/ccc/ddd/eee';
my $url2 = '/aaa/bbb/ccc?eee=true&fff=false';
for my $url ( $url1, $url2 ) {
print trim_path($url, $_), "\n" for 1 .. 5;
print "\n";
}
sub trim_path {
my ($url, $n) = @_;
$url = URI->new($url);
$url->query(undef);
my @path = $url->path_segments;
$url->path_segments( @path[0..$n] ) if $n < $#path;
return "$url";
}
/aaa
/aaa/bbb
/aaa/bbb/ccc
/aaa/bbb/ccc/ddd
/aaa/bbb/ccc/ddd/eee
/aaa
/aaa/bbb
/aaa/bbb/ccc
/aaa/bbb/ccc
/aaa/bbb/ccc
答案 2 :(得分:-1)
您可以使用split
功能提取所需信息
use strict;
use warnings;
my $name = '/aaa/bbb/ccc?eee=true&fff=false';
my @val = split(/\?/,$name);
my @parts =split(/\//,$val[0]);
print "@parts\n";
现在,您可以根据需要从@parts
数组中获取数据。
输出:
aaa bbb ccc