1

伙计们,我是 Perl 的新手,我现在处于参考章节中,这个主题让我感到困惑。我理解引用的概念,因为我也知道 C 编程。在我正在阅读的书中说:

“您不仅可以取消引用一个简单的变量名称,还可以取消引用 BLOCK 的内容。任何将字母数字标识符作为变量或子例程名称的一部分的地方,您都可以将标识符替换为 BLOCK 返回的引用正确的类型。”

我需要一个关于这部分的例子——“任何你将字母数字标识符作为变量的一部分......你可以用一个块替换标识符”——这到底是怎么发生的?

还有这个例子:

&{ $dispatch{$index} }(1, 2, 3);

有人可以解释该代码。

4

4 回答 4

2

引用的段落是说你不限于做

my $handler = $displatch{$type} or die;  # Arbitrary code
my $ref = $handler->();                  # Arbitrary code
my @a = @$ref;

你也可以做

my @a = @{ my $handler = $displatch{$type} or die; $handler->() };

其他取消引用也是如此。

$BLOCK
$BLOCK[ ... ]
$BLOCK{ ... }
@BLOCK
@BLOCK[ ... ]
@BLOCK{ ... }
%BLOCK
&BLOCK
&BLOCK( ... )
*BLOCK
于 2013-06-11T03:35:48.327 回答
1

$index包含哈希键的名称。 %dispatch是具有所述密钥的哈希。与该键关联的值是一个子例程引用,它&{}取消引用。1, 2, 3它作为它的参数被调用。

这是一个足够好的例子,虽然我通常会写:

$dispatch{$index}->(1, 2, 3)
于 2013-06-11T03:15:10.847 回答
1
sub sample_function1 {
   ...
}
sub sample_function2 {
   ...
}

%dispatch = ( 'f1' => \&sample_function1,
              'f2' => \&sample_function2 );

$index = <STDIN>;
chomp $index;
&{ $dispatch{$index} }(1, 2, 3);

如果用户输入f1this 将调用sample_function1(1, 2, 3),如果他输入f2它将调用sample_function2(1, 2, 3)

文档解释的是,由于您可以编写sample_function1(1, 2, 3),您可以将函数名称替换为包含返回函数引用的代码的块。

于 2013-06-11T03:28:34.107 回答
0

看看File::Find。您甚至可能以前使用过它。它是许多 Perl 程序员曾经使用的首批 Perl 模块之一。

find命令有两个参数:

  • 第二个(我们将从简单的开始)是我要搜索的目录列表。

  • 第一个参数有点棘手——它是我的find命令将使用的实际子程序。该find命令使用该子例程来确定我的目录树中的特定元素是否符合我正在寻找的标准。什么find是遍历我的目录树的每个元素并将该元素传递给我的子例程。由我的子程序来检查元素以查看它是否通过集合。

假设我想在我的目录中查找所有后缀.txt. 在 Unix 中,我可以这样做:

$ find $directory -type f -name "*.txt"

在 Perl 中,我创建了一个名为wanted. 该find命令将通过Perl 变量wanted将我目录中的一个元素传递给我的子例程。$_然后我可以测试该元素以查看它是否是具有.txt后缀的文件:

sub wanted {
    return unless -f;             #Return unless $_ is a file
    return unless /\.txt$/;       #Return unless that file has a `.txt` suffix
    print "$Find::File::name\n";  #It's a file that ends with .txt. Print it.
}

现在,我所要做的就是将我的wanted子程序作为我的find命令的第一个参数:

find ( \&wanted, $directory );

这里的所有都是它的。一个真实的例子,你很快就会(如果你还没有)遇到。在 C 编程语言中,wanted子例程称为回调例程。

于 2013-06-11T03:47:49.270 回答