2013-06-21 33 views
-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) 

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

+0

我无法遵循你所说的话,你能发布你试图运行的实际命令吗?和你的路径? –

+0

也是你的Perl解释器在'/ usr/bin/perl'上? –

+0

@HunterMcMillen perl解释器在/ use/bin/perl下是。 – user2131116

回答

3

shebang用于判断该脚本应该使用哪个解释器。为了达到这个目的,魔术数字#!必须出现在文件的开头。否则,使用默认解释器。

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

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

在一般情况下,如果家当不起作用,可能存在以下错误可以检查:

  • 的UTF字节顺序标记之前的#!
    诊断:一个hexdump在开头显示FE FF
    解决方案:配置编辑器来存储文件没有BOM
  • 脚本以这样的方式,一开始没有解码到#!为ASCII编码。
    诊断:当以ASCII形式打开文件时,该文件不以#!开头,或者不以012d在hexdump中开头。或者您的编辑器显示UTF-16或UTF-32作为编码。
    解决方案:以ASCII兼容编码存储脚本。 UTF-8是一个特别好的选择。
  • 非本地行尾可能会被混淆为可执行文件名称的一部分。例如。与Windows行结尾,在

    #!/usr/bin/perl 
    print 1; 
    

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

0

几个一般提示:

  • 您应该对认领钓警告-w。
  • 你也许应该也是use strict;
  • 请勿在“$ ARGV [0]”和“$ ARGV [1]”周围放置双引号,因为它们没有任何用处。
  • 使用 “做或死” 打开该文件的语法,例如:

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

做这些事情,我很肯定解决方案将出现迅速。

+1

永远不要使用Barewords for Filehandle!使用'打开我的$ fh,'>','...';'而不是'打开FH','>','...';' – 2013-06-21 13:29:36