Perl 将文件内容用作程序的参数

Perl 将文件内容用作程序的参数,perl,shell,arguments,Perl,Shell,Arguments,我有一个包含以下内容的文件: /filea /fileb /filec /filed 我有一个脚本xyz.pl来读取一个文件并对其进行处理 现在,我想自动将文件中的每一行作为参数提供给xyz.pl。有效地执行以下命令(按该顺序) 有没有快速的一行命令来执行此操作?您可以使用xargs。它应该做的是接收“文件A”(取自cat)的每一行,并以该数据作为参数执行给定的命令(xyz.pl) cat 'file A' | xargs -I{} xyz.pl '{}' 也就是说,{}是参数应该去的地方,

我有一个包含以下内容的文件:

/filea
/fileb
/filec
/filed
我有一个脚本xyz.pl来读取一个文件并对其进行处理

现在,我想自动将文件中的每一行作为参数提供给xyz.pl。有效地执行以下命令(按该顺序)


有没有快速的一行命令来执行此操作?

您可以使用
xargs
。它应该做的是接收“文件A”(取自
cat
)的每一行,并以该数据作为参数执行给定的命令(
xyz.pl

cat 'file A' | xargs -I{} xyz.pl '{}'
也就是说,
{}
是参数应该去的地方,并把它放在
xyz.pl
之后。它使它更加灵活,以防将来需要更改命令

请注意,此解决方案仅在假定每个文件名没有空格的情况下有效

编辑:等等,它似乎可以为我处理空间

编辑:如果这在所有情况下都不起作用,下面是一个示例:

xyz.pl

#!/usr/bin/perl
print "Perl processing: $ARGV[0]\n";
one.txt

/filea
/fileb
/filec
跑步:

$ cat one.txt | xargs -I{} ./xyz.pl '{}'
Perl processing: /filea
Perl processing: /fileb
Perl processing: /filec

将xargs与-n选项一起使用

cat A | xargs -n 1 xyz.pl
bash中的一行

$ for f in `cat A`; do xyz.pl $f; done

一行就足够了:

perl -lnwe 'print qx(xyz.pl $_)' fileA.txt
说明:

  • -l
    -自动压缩每行,添加要打印的换行符(以避免与换行符不一致)
  • -n
    --隐式
    while(){..}
    循环程序
  • qx()
    ——在shell中执行命令并返回标准输出
尽管最好的选择无疑是修改xyz.pl脚本,使其也接受标准输入形式的参数。很难说你会怎么做,因为我不知道你是如何处理争论的。那么这将是一个简单的问题:

perl xyz.pl < fileA.txt

这将不会通过一行一行的参数你的代码与我的选项将工作,我已经张贴之前,你已经编辑我猜:Pthanks的尝试。。。对于更一般的情况,我的情况有点复杂。在其中添加一个失败检查,如果其中一个迭代失败,则中止循环可能是一个好主意。避免使用cat,并合并Donal的建议:
同时读取arg;doxyz.pl“$arg”| | break;完成
为什么不向
xyz.pl
添加一些功能,这样您就可以将文件名作为参数传递,或者从STDIN接收参数?这不是我的程序,所以我不想弄乱代码。是否禁止您复制程序并重写输入函数?我有理由不这样做。当然,你可以打开一个黑框来编辑它,但是如果其他人正在使用它,而你破坏了你系统的其他部分呢?我不知道你的情况,所以我真的不能说你应该或不应该做什么。如果xargs为你做了,那对你有好处。就我个人而言,我是一个在任何情况下都会寻找完美解决方案的人,在这种情况下,完美的解决方案是修改原始脚本。
perl xyz.pl < fileA.txt
perl xyz.pl -f fileA.txt    # file as argument
perl xyz.pl /foo            # simple argument