-1

我有一个名为shuffle.pl. 当我perl shuffle.pl Input Shuffled用来执行时,它成功工作并且没有显示错误。

我在我的主目录下创建了一个名为./tools的目录,并将此路径设置为.cshrc. 所以我可以在不输入执行的情况下执行程序perl。(这是我第一次这样做,可能这里有些错误)

但是当我将 shuffle.pl 移动到 ~/.tools 并执行 . 它显示我在第 5 行有错误。但如果我使用perl ~/.tools/shuffle.pl它可以工作。所以这意味着它在我的程序中应该没有语法错误,但是为什么我把我的程序放到 ~/.tools 后它不能工作

错误信息

.tools/shuffle.pl: 5: Syntax error: "(" unexpected

.cshrc

set path = (. ~ ~/.tools /sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin )

在此处输入图像描述

谢谢

这是我的程序

#!/usr/bin/perl
use strict;
use warnings;

use List::Util qw(first max maxstr min minstr reduce shuffle sum); 

open(my $fh,"<","$ARGV[0]");
my @Lines = readline($fh);
my @Shuffled = shuffle(@Lines);
close $fh;

open(my $shuf,">","$ARGV[1]");
print $shuf @Shuffled;
close $shuf;

在此处输入图像描述

4

2 回答 2

3

shebang 用于告诉该脚本应该使用哪个解释器。为此,幻数#!必须出现在文件的开头。否则,使用默认解释器。

在这种情况下,shebang 前面有几行空行。他们必须被删除。

当使用显式解释器执行文件时,不会解析 shebang,例如在$ perl script.pl.
仅在作为可执行文件启动时才重要:./script.pl. 在这种情况下,内核需要弄清楚如何处理它:作为编译程序加载到内存中?启动口译员?哪一个?像这样的神奇数字#!解决了这个问题。

一般来说,如果shebang不起作用,可以检查以下可能的错误:

  • UTF 字节顺序标记位于#!.
    诊断:开始时显示 hexdump FE FF
    解决方案:配置您的编辑器以存储没有 BOM 的文件
  • 脚本以这样一种方式编码,即开头不会解码#!为 ASCII。
    诊断:文件#!以 ASCII 格式打开时不以 ASCII 开头或23 21以 hexdump 开头。或者您的编辑器将 UTF-16 或 UTF-32 显示为编码。
    解决方案:以兼容 ASCII 的编码存储脚本。UTF-8 是一个特别好的选择。
  • 非本地行结尾可能会被混淆为可执行文件名称的一部分。例如,使用 windows 行结尾,shebang in

    #!/usr/bin/perl
    print 1;
    

    可以作为解释器名称"/usr/bin/perl\r"。许多文件系统允许文件名中的行结尾。
    诊断:十六进制转储在可执行文件名称后显示除空格 ( 20) 或换行符 ( ) 以外的内容。解决方案:将行尾转换为 Unix。0A

于 2013-06-21T14:22:02.993 回答
0

一些一般提示:

  • 您应该在 shebang 线上使用 -w 来捕获警告。
  • 你应该use strict;也应该。
  • 不要在 "$ARGV[0]" 和 "$ARGV[1]" 周围加上双引号,因为它们没有任何作用。
  • 在文件打开时使用“do or die”语法,例如:

    打开(文件,“<”,$ARGV[0])|| die "文件打开错误:$!";

做这些事情,我很确定解决方案会很快出现。

于 2013-06-21T13:25:56.123 回答