2012-08-02 45 views
1

我可以有一个Perl子程序作为其成员的数组吗? 我有以下类型的子程序:子程序作为数组成员

sub CheckForSprintfUsage { 
    my ($line, $fname, $linenum) = @_; 
    if ($line =~ /\bsprintf\b/) { 
    printError((caller(0))[3],$fname,$linenum); 
    } 
} 

我想这样子例程添加到一个数组,这样我可以遍历它,并给他们打电话。

回答

9

子程序插入引用到数组:

my @array = (
    \&foo, 
    \&bar, 
    sub { 
     # Do something inside anonymous subroutine 
    }, 
    \&CheckForSprintfUsage, 
); 
$array[1]->(); # Call subroutine `bar` 

参数可以传递,以及:

$array[1]->('argument 1', 'argument 2'); 
3

是。你可以在Perl中引用你想要的任何东西,所以你可以有一个Perl函数的数组。

#! /usr/bin/env perl 

use strict; 
use warnings; 

my @array; 

sub foo { 
    my $name = shift; 
    print "Hello $name, I am in foo\n"; 
} 

# Two ways of storing a subroutine in an array 

# Reference to a named subroutine 
$array[0] = \&foo; #Reference to a named subroutine 

# Reference to an unnamed subroutine 
$array[1] = sub { #Reference to an anonymous subroutine 
    my $name = shift; 
    print "Whoa $name, This subroutine has no name!\n"; 
}; 

# Two ways of accessing that subroutine 

# Dereference using the "&" 
&{$array[0]}("Bob"); #Hello Bob, I am in foo 

# Using Syntactic sugar. Really same as above 
$array[1]->("Bob"); #Whoa Bob, This subroutine has no name!