【问题标题】:How to add a library from another perl file?如何从另一个 perl 文件添加库?
【发布时间】:2016-04-26 12:49:33
【问题描述】:

我想将一个库导入到我的 perl 脚本中。以下是我的尝试:

function.pl

#!/usr/bin/perl
package main; 
use strict;
use warnings;
use 5.005;
use Term::ANSIColor qw(:constants); 
use LWP::Simple;    
use diagnostics;
use File::Spec;
use Getopt::Long;
use File::Basename;
use Cwd 'abs_path';

sub myfunction {
    print RED, " Deleting...", RESET;
    system("rm –f /file_location/*.");
    print "deleted.\n";      
}

我想在这个新的 perl 脚本中导入 function.pl。

#!/usr/bin/perl    
package main; 

myfunction;
myfunciton2;

【问题讨论】:

  • 这对 stackoverflow 来说是个糟糕的问题。不清楚
  • @realmaniek like include ("functions.php");如果您已写入 php 模板,您将调用该文件。我想用 perl 我希望我让自己清楚
  • 也许你应该看看userequire
  • 请添加您的源代码示例以及您尝试归档所请求结果的内容。
  • @MusaYıldırım ,首先让你的问题更清楚,展示一些作业,添加一些代码 sn-ps 并具体说明你想要什么。参考How to ask

标签: perl


【解决方案1】:

删除 package main; - 不需要。

最佳实践方法(但不是最简单的方法):

创建一个新目录 MyApp(用您的应用程序的某个唯一名称替换)并将文件 Global.pm 放入此目录:

package MyApp::Global; # Same name as Directory/File.pm!
use strict;
use warnings;

use Exporter;
use Term::ANSIColor qw(:constants);

our @ISA       = ('Exporter');
our @EXPORT_OK = qw(myfunction);

sub myfunction {
    print RED, " Deleting...", RESET;
    system("rm –f /file_location/*.");
    print "deleted.\n";  
}

1; # Important!

在使用行之后插入两个文件(function.pl 和 newone.pl):

use MyApp::Global qw(myfunction);

基本方法(类似 PHP:更简单,但不是“最佳实践”):

创建一个文件global.pl(或任何其他名称):

use strict;
use warnings;

use Term::ANSIColor qw(:constants);

sub myfunction {
    print RED, " Deleting...", RESET;
    system("rm –f /file_location/*.");
    print "deleted.\n";  
}

1; # Important!

use 行之后插入两个文件(function.pl 和 newone.pl):

require 'global.pl';

另见:

【讨论】:

  • 另外,至少请看一下Module Tutorial
  • 我认为您不应该仅仅因为 OP 似乎熟悉 PHP 的工作方式而发布 不是“最佳实践” 的内容.每种语言都是不同的,当人们用 Perl 编写 C 或 PHP 程序时,这一点通常很清楚。虽然新概念必须基于某些东西,但鼓励人们像使用更熟悉的语言一样编写是错误的,尤其是当这会导致不良实践代码时
  • 这比创建一个模块更容易,功能齐全,Perl 是 TIMTOWTDY。使用require 加载库文件并不少见,这就是我包含它的原因。但我会把它移下来。
  • @Sebastian:只要复制您的代码的人知道它的作用和工作原理,一切都很好。这几乎不会发生。询问如何创建库的人正在寻找公式。他们将采用他们读到的第一个有效的东西并将其放入他们的代码中,然后毫无疑问地将其复制到数百个其他程序中。当您的有用建议不起作用时,可能会在一个贫穷的未开化地区造成干旱。请不要那么无礼:缺少分号会害死人。都是因为它“更容易”
  • @Sebastian 感谢一切,顺便说一句,我无法删除到 package main 因为我在我的项目中使用...
【解决方案2】:

如果您只想要一个容器来存放许多实用程序子例程,那么您应该使用Exporter

创建一个库模块

将您的包和模块文件命名为 main 以外的名称,这是您的主程序使用的默认包。在下面的代码中,我编写了模块文件Functions.pm,其中包含package Functions。名称​​必须匹配

函数.pm

package Functions;

use strict;
use warnings;

use Exporter 'import';
our @EXPORT_OK = qw/ my_function /;

use Term::ANSIColor qw(:constants); 


sub my_function {
    print RED, " Deleting...", RESET;
    system("rm –f /file_location/*.");
    print "deleted.\n";      
}

1;

program.pl

#!/usr/bin/perl    

use strict;
use warnings 'all';

use Functions qw/ my_function /;

my_function();

【讨论】:

  • @Borodin 我做了,但我收到了如下错误消息: Undefined subroutine &main::my_function called at ./program.pl line 8.
  • @MusaYıldırım:如果你完全复制我的代码,你会发现它可以工作。你必须运行一些稍微不同的东西
  • @Borodin 好的,我知道了,如果是远程文件,我该怎么办?
  • @MusaYıldırım:这是一个不同的问题。目前还不清楚 what 文件是远程的,您应该听听 cmets 中发布的关于您自己努力寻找解决方案的建议。听起来真正的问题是你不知道如何编写代码,而 Stack Overflow 帮不了你
  • 我做到了,如果它是远程文件,我如何获取?我可以解释一下这个主题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2021-03-30
相关资源
最近更新 更多