有没有更好的方法来删除perl中字符串数组的字符串?

时间:2012-12-04 23:44:29

标签: regex arrays perl

我有一个Perl数组的URL都包含“http://”。我想从每个字符串中删除该字符串,只留下域名。我正在使用以下for循环:

#!/usr/bin/perl

### Load a test array
my @test_array = qw (http://example.com http://example.net http://example.org);

### Do the removal
for (my $i=0; $i<=$#test_array; $i++) {
    ($test_array[$i] = $test_array[$i]) =~ s{http://}{};
}

### Show the updates
print join(" ", @test_array);

### Output: 
### example.com example.net example.org

它工作正常,但我想知道是否有更有效的方法(无论是在处理方面还是在减少打字方面)。有没有更好的方法从字符串数组中删除给定的字符串?

3 个答案:

答案 0 :(得分:6)

当我解析uris时,我使用URI

use URI qw( );
my @urls = qw( http://example.com:80/ ... );
my @hosts = map { URI->new($_)->host } @urls;
print "@hosts\n";

答案 1 :(得分:5)

您不需要此行中的作业:

($test_array[$i] = $test_array[$i]) =~ s{http://}{};

你可以使用:

$test_array[$i] =~ s{http://}{};

为了减少打字,请利用$_变量:

for (@test_array) {
  s{http://}{};
}

答案 2 :(得分:0)

我建议使用map功能。它将操作应用于数组中的每个元素。您可以将for循环压缩为一行:

map s{http://}{}, @test_array;

另外,作为旁注,以空格分隔格式打印数组内容的更简单方法是简单地将数组放在双引号字符串中:

print "@test_array";