如何在Perl中使用块作为变量名

时间:2013-06-11 03:11:53

标签: perl reference

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

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

我需要一个关于这一部分的例子 - “你把一个字母数字标识符作为变量的一部分放在哪里......你可以用一个块替换标识符” - 这究竟是怎么回事?

也是这个例子:

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

有人可以解释一下这段代码。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

这是一个很好的例子,虽然我通常写道:

$dispatch{$index}->(1, 2, 3)

答案 2 :(得分:1)

sub sample_function1 {
   ...
}
sub sample_function2 {
   ...
}

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

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

如果用户输入f1,则会拨打sample_function1(1, 2, 3),如果他输入f2,则会拨打sample_function2(1, 2, 3)

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

答案 3 :(得分:0)

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

find命令有两个参数:

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

  • 第一个参数有点棘手 - 它是我的find命令将使用的实际子例程。 find命令使用该子例程来确定目录树中的特定元素是否与我正在寻找的条件匹配。 find所做的是遍历目录树的每个元素,并将该元素传递给我的子例程。这取决于我的子程序,检查元素是否通过了集合。

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

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

在Perl中,我创建了一个名为wanted的子程序。 find命令将通过wanted Perl变量将$_子程序传递给我的目录中的元素。然后我可以测试该元素以查看它是否是具有.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子例程将被称为Callback例程。

相关问题