Perl:子程序输出;输入foreach声明

时间:2012-02-09 19:31:47

标签: perl foreach subroutine

我有一个子路由,它输出一个FQDN列表,用新行分隔:

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

^^它采用这种格式,因此除了{variable text}之外没有任何模式。{variable text}。{variable text}

我的问题是我如何才能将此输出作为foreach语句的输入,以便我可以遍历每个FQDN?

3 个答案:

答案 0 :(得分:6)

NB:你说子输出一个列表,但我假设你的意思是输出一个字符串。否则,这个问题没有实际意义。

只需在换行符上拆分输出。假设子例程被称为subname

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

正如Brian Roach在评论中指出的那样,最佳解决方案是使子例程返回列表而不是字符串。但是,这对您来说可能不是一个可行的解决方案。无论哪种方式,如果您想尝试一下,只需在子程序中的适当位置添加split即可。 E.g:

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

如果你想要进阶,你可以使用wantarray函数,该函数检测调用子程序的上下文:

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

虽然这很可爱,但除非你知道自己在做什么,否则会导致不必要的行为。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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();