Perl: вывод подпрограммы; вход в оператор foreach - PullRequest
3 голосов
/ 09 февраля 2012

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

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

^^ В этом формате, поэтому нет другого шаблона, кроме {переменный текст}. {Переменный текст}. {Переменный текст}

Мой вопрос заключается в том, как мне получить ЭТОТ вывод в качестве ввода оператора foreach, чтобы я мог выполнять итерацию по каждому полному доменному имени?

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012

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

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

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

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

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

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

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

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

1 голос
/ 09 февраля 2012
my $data = mySubRoutine()
# Data now contains one FQDN per line

foreach (my $line = split(/\n/,$data))
{
     doStuffWith($line);
}
0 голосов
/ 10 февраля 2012

Интересно, действительно ли вы имеете в виду, что ваша подпрограмма "выводит" список - т.е. что он печатает список в 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();
...