perl:强制使用命令行标志?

时间:2011-04-05 22:48:30

标签: perl

我经常在命令行上编写单行代码,如下所示:

perl -Magic -wlnaF'\t' -i.orig -e 'abracadabra($_) for (@F)' 

为了对此进行描述,我可以将相同的标志传递给shebang线:

#!/usr/bin/perl -Magic -wlnaF'\t' -i.orig
abracadabra($_) for (@F);

然而,这有两个问题。首先,如果某人通过直接将其传递给perl来调用脚本(如'perl script.pl',而不是'./script.pl'),则会忽略这些标志。另外,我不能使用“/ usr / bin / env perl”,因为很明显我用env调用它时不能将参数传递给perl,所以我不能使用不同的perl安装。

有没有告诉剧本“嘿,总是像你用-wlnaF'\ t'-i.orig一样调用”?

2 个答案:

答案 0 :(得分:3)

你对perl script.pl版本不正确; Perl专门查找和解析#!行中的选项,即使在非Unix上也是如此,如果是以脚本而不是直接运行。

  

始终检查#!行是否为行   解析。因此,如果您在一台只允许一个参数的机器上   使用#!行,或者更糟糕的是,甚至不会识别#!行   无论Perl如何,仍然可以获得一致的切换行为   调用,即使-x用于查找程序的开头。

(...)

  

解析#!个开关,只要在perl中提到{。}}   线。序列“ - *”和“ - ”被特别忽略,以便你   如果你这么倾向,可以说

#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
    if 0;
     

让Perl看到-p开关。

现在,上面的引用预计为perl -x,但如果您使用

启动脚本,它也可以正常工作
#! /usr/bin/env perl                                                   -*-perl -p-*-

(有足够的字符可以超过具有该限制的系统的32个字符限制;有关详细信息以及我上面引用的其他内容,请参阅perldoc perlrun

答案 1 :(得分:0)

我在#!env perl -...上遇到了同样的问题,env最终有所帮助:

$ env 'perl -w'
env: ‘perl -w’: No such file or directory
env: use -[v]S to pass options in shebang lines

因此,只需将shebang修改为#!/usr/bin/env -S perl -...