如何在Perl中将用户定义的函数添加为内置函数?

问题描述 投票:0回答:1

一次,我在考虑如何在Perl中创建一个包(或类)以便代码可重用。来自C ++背景,我很难理解Perl子例程和软件包的工作方式。因此,我在Perl中创建了一个Stack数据结构(实际上只是一种使用LIFO方法的数组),每次我想打印该循环时都需要我写下该循环(效率非常低)]

@_ = (1, 8, 14, 45);

push(@_, 69);
push(@_, 55);
push(@_, 65536);
push(@_, 4294967296);

print "Print without newline: ";

$size = @_;
for my $i(1 .. ($size-1))
{
    print $_[$i]." ";
}

print "Print with newline: ";

for my $i(1 .. ($size-1))
{
    say scalar $_[$i];
}

pop(@_);
pop(@_);
pop(@_);

print "Print without newline: ";
# HERE WE GO AGAIN
$size = @_;
for my $i(1 .. ($size-1))
{
    print $_[$i]." ";
}

然后,我开始学习有关创建软件包以重用代码的更多信息。这是我执行此操作的一个示例。

Printer.pm

use Modern::Perl;

package Printer;
sub new
{
    my $class = shift;
    my $self = {};

    bless $self, $class;

    return $self;
}

my $size;
sub println
{   
    my @userArray = @_;
    $size = @userArray;
    for my $i(1 .. ($size-1))
    {
        say scalar $userArray[$i];
    }
}

sub print
{   
    my @userArray = @_;
    $size = @userArray;
    for my $i(1 .. ($size-1))
    {
        print $userArray[$i]." ";
    }

}

1;

Stack.pl的伪代码

use lib ".\\";
use Array::Printer;

. . .

my $printer = new Printer();
print "Print without newline: ";
print $printer->print(@_);
print "\nPrint with newline: \n";
print $printer->println(@_);

say "";

# POPPING (LIFO)
pop(@_);
pop(@_);
pop(@_);

print $printer->print(@_);

而且,正如您已经猜到的那样,它的作用就像是魅力。

尽管有一天,我脑海中浮现出一件事。我想知道是否可以将在打印机软件包中内置的“ println”功能作为“内置”功能使用。没有调用包的构造函数。我在想像这样的东西:

println(@_);

由于println在Perl中不存在,所以我很好奇是否可能这样做。关于下一步该怎么做?

perl oop reusability code-reuse
1个回答
0
投票

如果要模拟内置的,则不需要类,只需要一个库。库在Perl中也以包的形式实现,但是它们中的子例程不希望将类名或对象作为第一个参数传递。您也可以使用(导出器)[https://metacpan.org/pod/Exporter]将子例程插入到调用程序的符号表中。

看起来像这样:

package Array::Printer;

use strict;
use warnings;
use feature 'say';

require Exporter;
our @ISA = qw[Exporter];
our @EXPORT = qw[println];

sub println {
  say for @_;
}

1;

您会这样使用它:

#!/usr/bin/perl

use strict;
use warnings;

use lib '.';
use Array::Printer;

# I've used @stack instead of @_ in my code as @_ is a
# special variable and it seems strange to use it in another way.

my @stack = (1, 8, 14, 45);
push(@stack, 69);
push(@stack, 55);
push(@stack, 65536);
push(@stack, 4294967296);

println(@stack);

pop(@stack);
pop(@stack);
pop(@stack);

println(@stack);
© www.soinside.com 2019 - 2024. All rights reserved.