在Perl中,如何从URI中提取部分主机名?

时间:2012-05-18 10:00:13

标签: perl uri

我想找到一个以http://开头并以.com结尾的字符串。 但http://.com不需要打印。

$str = "http://example.com";
$str =~ /http:\/\/example.com/;$result = "$&\n";
print $result; 

与使用python完成的操作基本相同。

#!/usr/bin/python
import re
str = 'http://example.com'
search = re.search(r'http://(\w+).com', str)
if search:
  print search.group(1)

它只会显示“示例”。如何在Perl中做到这一点?

4 个答案:

答案 0 :(得分:3)

使用专业解析器的强大解决方案:

use feature 'say';
use strict; use warnings;

use URI;
use URI::Find;

URI::Find->new(sub {
    my $uri = shift;
    say $uri->host =~ m{(\w+)[.]com\z};
})->find(\ (my $x = q{http://example.com/}) );

答案 1 :(得分:0)

试试这个简单的代码:

$str = 'http://example.com'; 
print "$_\n" for $str =~ m{\A http:// (\w+) [.] com \z}x;

为确保您的结果完整,请将模式锚定在开头\A,然后结束\z。使用与/不同的模式分隔符来避免倾斜牙签综合征,并使用x选项使您的模式更具可读性。

您需要使用(...)来捕获要提取的部分。

您可以在ideone.com

上测试此代码

答案 2 :(得分:0)

下面不是那样的perlish解决方案:

$str = 'http://example.com';

if (($url) = $str =~ /http:\/\/(\w+)\.com/) {
    print $url, "\n";
}

答案 3 :(得分:-1)

在你的Python片段中,你用括号捕获你想要的文本,但在你的Perl片段中你已经把它们遗漏了。此外,您要捕获的部分是硬编码的,而不是表示为\w+。在那里挖掘。