如何获取当前正在运行的Perl脚本的名称?

3

我有一个脚本

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';
use mwe 'tmp';

tmp();

调用一个Perl模块mwe

use feature 'say';
package mwe;
use Cwd 'getcwd';
use Exporter qw(import);
our @EXPORT = qw(tmp);

sub tmp {
    say 'written by ' . getcwd() . '/' . __FILE__;
}
1;

但是当我运行这个脚本时,文件名从模块中出现:

con@V:~/Scripts$ perl mwe.pl
written by /home/con/Scripts//home/con/perl5/perlbrew/perls/perl-5.34.0/lib/5.34.0/mwe.pm

我在编写模块方面还很新手,如果我的最小工作示例不好,请提出建议。

我的问题是:我知道可以将文件/home/con/Scripts/mwe.pl作为参数传递给子例程tmp,但是否有办法让像tmp这样的子例程自动返回脚本文件名?

3个回答

2

使用

use FindBin qw( $RealScript );
say $RealScript;

或者

use Cwd qw( abs_path );
say abs_path($0);

大多数情况下,人们实际上想要脚本所在的目录。为此,请使用以下命令:

use FindBin qw( $RealBin );
say $RealBin;

或者

use Cwd qw( abs_path );
use File::Basename qw( dirname );
say dirname(abs_path($0));

1

在 mwe.pm 中,改为以下内容:

say 'written by ' . getcwd() . '/' . __FILE__;

使用:

say 'written by ' . getcwd() . '/' . $0;

2
这通常会失败。 - ikegami
2
要明确的是,如果将绝对路径传递给 perl,则此操作将失败,这是一个常见情况。 - ikegami
@ikegami,一开始我几乎想要给出一种从脚本传递文件路径到模块的响应。 - stefan_aus_hannover

-1
请检查以下代码片段是否符合您的问题。
在主脚本中声明了一个变量,使用our $__SCRIPT__ = abs_path($0),它获取脚本的名称$0并添加绝对路径。
可以从任何模块访问此变量,如$main::__SCRIPT__
use strict;
use warnings;
use feature 'say';

use Cwd 'abs_path';
use Test::Some;

our $__SCRIPT__ = abs_path($0);

my $args = {
              id  => '2000',
              str => 'Magic string'
           };

my $m = new Some($args);

$m->show();

模块Test::Some的源代码

package Some;

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

sub new {
    my ($class, $arg) = @_;
    my $self = bless {
            id      => $arg->{id},
            str     => $arg->{str}
    }, $class;

    return $self;
}

sub show {
    my $self = shift;

    say 'PACKAGE:  ' . __PACKAGE__;
    say 'PKG_FILE: ' . __FILE__;
    say 'SCRIPT:   ' . $main::__SCRIPT__;
    say 'SELF_ID:  ' . $self->{id};
    say 'SELF_STR: ' . $self->{str};
}

1;

输出示例

PACKAGE:  Some
PKG_FILE: /kunden/homepages/6/d807xxxxxx/htdocs/.perl/Test/Some.pm
SCRIPT:   /homepages/6/d807xxxxxx/htdocs/work/perl/examples/xmodule.pl
SELF_ID:  2000
SELF_STR: Magic string

参考资料: 绝对路径, Perl全局变量


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接