0

首先,让我告诉你,我很少使用数组,从来没有使用过哈希。另外,Perl 不是我最强的脚本语言。我来自 shell 脚本的背景。

也就是说,我在 Perl 脚本中有这个:

$monitored_paths = { '/svn/test-repo'  => 'http://....list.txt' };

URL 指向一个包含如下路径列表的文件:

/src/cpp
/src/test
/src/test2

目标是用以下内容替换 URL:

$monitored_paths = {'svn/test-repo' => '/src/cpp', '/src/test', '/src/test2'}

实现这一目标的最佳方法是什么?谢谢!

山姆

4

4 回答 4

1

你的问题的前提有一个错误,因为这一行:

$monitored_paths = {'svn/test-repo' => '/src/cpp', '/src/test', '/src/test2'}

相当于以下任何一个:

$monitored_paths = {'svn/test-repo' => '/src/cpp', '/src/test' => '/src/test2'}
$monitored_paths = {'svn/test-repo', '/src/cpp', '/src/test', '/src/test2'}

你真正想要的是:

$monitored_paths = {'svn/test-repo' => ['/src/cpp', '/src/test', '/src/test2']}

其中 [] 表示数组引用。您可以像这样创建一个数组引用:

my $arrayref = [1, 2, 3]; # called an "anonymous array reference"

或像这样:

my @array = (1, 2, 3);
my $arrayref = \@array; 

你想要这样的东西:

$monitored_paths = { '/svn/test-repo'  => 'http://....list.txt' }
foreach my $key (keys %$monitored_paths) {
    next if ref $monitored_paths{$key} eq 'ARRAY'; # skip if done already
    my @paths = get_paths_from_url($key);
    $monitored_paths->{$key} = \@paths; # replace URL with arrayref of paths
}

用你的 URL 获取和解析函数替换 get_paths_from_url (使用 LWP 或其他什么......因为这不是你问题的一部分,我假设你已经知道如何做到这一点)。如果您编写函数 get_paths_from_url 以首先返回数组引用而不是数组,则可以保存一个步骤并$monitored_paths->{$key} = get_paths_from_url($key)改为编写。

于 2012-06-26T20:09:15.700 回答
0

如果您想从文件中读取并将每个路径添加到数组中,您可以执行以下操作:

use strictures 1;

my $monitored_paths = {};
open( my $FILE, '<', '/path/to/file' ) or die 'Unable to open file '. $!;
while($FILE){
    push @{ $monitored_paths->{'svn/test-repo'} }, $_;
}
于 2012-06-26T19:00:10.457 回答
0
use LWP::Simple;
my $content = get($url); ## do some error checking
$monitored_paths = {'svn/test-repo' => [split( "\n", $content)]}
于 2012-06-26T18:56:02.840 回答
0
use LWP;
foreach (keys %monitored_paths)
{
   my  $content = get($monitored_paths{$_});# Perform error checking
   $monitored_paths_final {$_} = join(",",split("\n",$content));
}
于 2012-06-26T20:07:56.093 回答