我有一个名为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;
答案 0 :(得分:3)
shebang用于告诉哪个解释器应该用于此脚本。为此,幻数#!
必须出现在文件的最开头。否则,使用默认解释器。
在这种情况下,shebang前面有几条空行。他们必须被删除。
当使用显式解释器执行文件时,不会解析shebang,例如。在$ perl script.pl
只有在作为可执行文件启动时才很重要:./script.pl
。在这种情况下,内核需要弄清楚如何处理它:作为编译程序加载到内存中?启动翻译?哪一个?像#!
这样的幻数解决了这个问题。
通常,如果shebang不起作用,可以检查以下可能的错误:
#!
之前
诊断:一个hexdump在开头显示FE FF
解决方案:将编辑器配置为存储没有BOM的文件#!
诊断:当以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)
一些一般提示:
use strict;
。打开文件时使用“do或die”语法,例如:
打开(文件,“&lt;”,$ ARGV [0])||死“文件打开错误:$!”;
做那些事情,我很确定解决方案会很快出现。