【问题标题】:Why doesn't Perl find my script when I use the -I switch?为什么当我使用 -I 开关时 Perl 找不到我的脚本?
【发布时间】:2026-02-07 18:00:01
【问题描述】:

我已经用谷歌搜索了一种方法来做这种事情。

我使用这个 shell 命令:

perl -I/p2 maxconnect4.p1 arg1 arg2 arg3 arg4

我的 pl 文件和 pm 文件都在“p2”目录中。

但是,它给了我一个错误:

Can't open perl script "maxconnect4.pl": No such file or directory

谁能解释一下原因?

【问题讨论】:

    标签: perl shell command


    【解决方案1】:

    你有两个问题:

    1. -I 不适用于命令行中指定的文件,仅适用于使用requireuse 加载的模块。

    2. 您不应将相对目录与-I 一起使用。如果您的脚本执行chdir,那么该目录现在相对于 new 当前目录,而不是脚本启动时的当前目录。 (在很多情况下,你可以打破这个规则,因为大多数时候,模块是在脚本启动时加载的,在它改变目录之前。)

      而且你实际上并没有使用相对目录,因为你说-I/p2,这意味着在一个名为/p2的目录中查找,而不是在当前目录中名为p2的子目录中查找(这就是你想说)。

    试试:

    perl -I$PWD/p2 p2/maxconnect4.pl arg1 arg2 arg3 arg4
    

    (假设您使用的是 Unix 类型的 shell)。

    在许多情况下,更好的解决方案是让脚本自动设置@INC。在p2/maxconnect4.pl 的顶部(在从p2 加载任何模块之前,放置):

    use FindBin;
    use lib $FindBin::Bin;
    

    use lib-I 开关的编程版本,FindBin 告诉您的脚本它所在目录的路径名。然后你可以说:

    perl p2/maxconnect4.pl arg1 arg2 arg3 arg4
    

    而且根本不用担心-I

    【讨论】:

    • 是的,我应该是绝对目录。非常感谢。它有效。
    【解决方案2】:

    perl 需要一个真实的文件来执行。你必须通过它的绝对或相对路径来调用它:

    perl -I p2 p2/maxconnect4.pl arg1 arg2 arg3 arg4
    

    【讨论】:

    • 非常感谢。我试过你的方法。它给了我一个新错误:
    • 如果我进入目录 p2,并使用命令:perl maxconnect4.pl arg1 arg2 arg3 arg4。它运作良好。我想这是搜索路径的问题。我对 Perl 完全陌生。非常感谢您的帮助。
    • AiPlayer.pm 文件在硬盘上的物理位置?
    最近更新 更多