2

すべて「http://」を含む URL の Perl 配列があります。ドメインだけを残して、それぞれからその文字列を削除したいと思います。次の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

それは正常に動作しますが、より効率的な方法があるかどうか疑問に思っています (処理の観点から、またはタイピングの削減の観点から)。文字列の配列から特定の文字列を削除するより良い方法はありますか?

4

3 に答える 3

6

uris を解析するときは、URIを使用します。

use URI qw( );
my @urls = qw( http://example.com:80/ ... );
my @hosts = map { URI->new($_)->host } @urls;
print "@hosts\n";
于 2012-12-05T00:00:10.527 に答える
5

この行の割り当ては必要ありません。

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

あなたはただ使うことができます:

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

タイピングをさらに少なくするには、$_変数を利用します。

for (@test_array) {
  s{http://}{};
}
于 2012-12-04T23:49:54.150 に答える
0

関数を使用することをお勧めしmapます。配列内のすべての要素にアクションを適用します。for ループを 1 行にまとめることができます。

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

また、補足として、配列の内容をスペース区切り形式で出力する簡単な方法は、配列を二重引用符で囲まれた文字列内に配置することです。

print "@test_array";
于 2012-12-04T23:54:51.173 に答える