3

サブルーチンをメンバーとして持つ Perl 配列を使用できますか? 次のタイプのサブルーチンがあります。

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

そのようなサブルーチンを配列に追加して、反復処理して呼び出すことができるようにしたいと考えています。

4

2 に答える 2

10

サブルーチンへの参照を配列に挿入します。

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

引数も同様に渡すことができます:

$array[1]->( 'argument 1', 'argument 2' );
于 2012-08-02T13:01:29.040 に答える
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!
于 2012-08-02T13:22:19.613 に答える