将程序导致的位置更改为语法错误

时间:2013-06-21 13:21:20

标签: perl

我有一个名为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 )

enter image description here

感谢

这是我的程序

#!/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;

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

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

通常,如果shebang不起作用,可以检查以下可能的错误:

  • UTF字节顺序标记位于#!之前 诊断:一个hexdump在开头显示FE FF 解决方案:将编辑器配置为存储没有BOM的文件
  • 脚本的编码方式使得开头不会以ASCII码的形式解码为#! 诊断:当以ASCII格式打开时,文件不以#!开头,或者在hexdump中不以23 21开头。或者您的编辑器显示UTF-16或UTF-32作为编码 解决方案:以ASCII兼容编码存储脚本。 UTF-8是一个特别好的选择。
  • 非本机行结尾可能会混淆成为可执行文件名的一部分。例如。与windows line endings,shebang in

    #!/usr/bin/perl
    print 1;
    

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

答案 1 :(得分:0)

一些一般提示:

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

    打开(文件,“&lt;”,$ ARGV [0])||死“文件打开错误:$!”;

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