2012-02-09 5 views
3

У меня есть subrouting, который выводит список FQDN,, разделенный новые линии:Perl: выход подпрограммы; вход в Еогеаспе заявление

x1.server.com 
s2.sys.com 
5a.fdsf.com 

^^ Именно в этом формате, так что нет никакой закономерности, кроме {переменной текста} {переменного текста. }. {variable text}

Мой вопрос: как я смогу получить этот вывод как входной сигнал инструкции foreach, чтобы я мог выполнять итерацию по каждому FQDN?

ответ

6

NB: Вы говорите, что субвывод содержит список, но я предполагаю, что вы имеете в виду, что он выводит строку. В противном случае этот вопрос спорный.

Просто разделите выход на новую строку. Предполагая, что функция вызывается subname:

for my $fqdn (split /\n/, subname()) 

Как Брайан Роуч отмечает в комментариях, оптимальным решением является сделать подпрограмма возвращает список вместо строки. Однако это не может быть для вас жизнеспособным решением. В любом случае, если вы хотите попробовать, просто добавьте split в соответствующее место в подпрограмме. Например:

sub foo { 
    ... 
    #return $string; 
    return split /\n/, string; 
} 

Если вы хотите, чтобы получить передовые, вы можете использовать функции wantarray, который определяет, в каком контексте называется подпрограмма:

sub foo { 
    ... 
    return $string unless wantarray; 
    return split /\n/, string; 
} 

Хотя это очень мило, это может приводят к нежелательному поведению, если вы не знаете, что делаете.

+3

+1 Или ... измените подпрограмму, чтобы фактически вернуть массив, а не строку. –

+1

@BrianRoach Это было бы оптимально для этого случая, но может случиться так, что он не может изменить подпрограмму из-за того, что она используется в другом месте. – TLP

+1

@TLP - спасибо за это, я приму свой ответ. @Brian Roach: Я в конечном итоге принял ваш совет. Я добавил «push @ results, $ domain», а затем «return @ results» в их уважаемые части подпрограммы, а затем вызвал цикл foreach, как 'foreach $ host (get_mirror_list()) {', и он работал красиво. Я не эксперт в perl, поэтому любой экспертный совет, который я могу получить, я пытаюсь реализовать, а не просто, хотя, похоже, было проще сделать это. Благодаря! – drewrockshard

1
my $data = mySubRoutine() 
# Data now contains one FQDN per line 

foreach (my $line = split(/\n/,$data)) 
{ 
    doStuffWith($line); 
} 
0

Интересно, если вы на самом деле означает, что ваши подпрограммы «выходы» список - то есть, что он печатает список в STDOUT. У вас есть что-то вроде этого?

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

sub print_list_of_fqdns { 
    say "x1.server.com\ns2.sys.com\n5a.fdsf.com"; 
} 

print_list_of_fqdns(); 

Если это так, то вам нужно быть немного умным и повторно открыть STDOUT на переменную.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

sub print_list_of_fqdns { 
    say "x1.server.com\ns2.sys.com\n5a.fdsf.com"; 
} 

sub get_list_of_fqdns { 
    # Declare a buffer 
    my $string; 

    # Open a filehandle that writes to the buffer 
    open my $fh, '>', \$string or die $!; 

    # Set your new filehandle to the default output filehandle 
    # (taking a copy of the original one) 
    my $old_fh = select $fh; 

    # Call the function. This will now write the list to the 
    # variable $string instead of STDOUT 
    print_list_of_fqdns(); 

    # Split $string to get the individual FQDNs 
    my @fqdns = split /\n/, $string; 

    # Replace the old default output filehandle 
    select $old_fh; 

    # Return the list of FQDNs 
    return @fqdns; 
} 

say join '/', get_list_of_fqdns();