Perl 使用@ARGV
包含每个 shell 参数值的数组:
$ perl -e 'print join (":", @ARGV) . "\n" ;' this is a test
this:is:a:test
如您所见,命令行上的所有参数都是在@ARGV
.
$ perl -e 'print "$ARGV[2]\n" ;' one two three four
three
这打印出第三个参数(因为@ARGV
计数从 开始0
)。
这回答了你的问题了吗?
附录
编辑:我的 test.pl 代码如下
system( q( perl -ne '/^.QQQ/ig && print' abc.l > data1.l) );
system( q( perl -ne '/.SSS/ig && print' data1.l > data2.l) );
open(fh,"<data3.l");
open(fh1,">>data31.l");
while (my $string =<fh>) {
...
为什么不简单地省略这些system
语句,并且只处理一次您的数据:
use strict;
use warnings;
use autodie;
open my $input_file, "<", "abc.1";
open my $output_file ">>", "data31.l"
while ( my $string = <$input_file> ) {
chomp $string;
# These skip over the lines you don't want
# No need to "prep" your input first
next unless $string =~ /^.QQQ/i;
next unless $string =~ /.SSS/ig;
# Here be dragons
say $ouput_file "$something";
}
close $input_file;
close $output_file;
这更容易理解。您不再依赖于system
命令,您不会创建一堆临时文件,而且效率更高,因为您只遍历每一行一次。
附录二
这是个好主意,但我有很多这样的单行器,我不确定我的代码在将单行器转换为代码后是否可以工作。那么他们有没有机会按照我问的方式做到这一点??????
如果我对您的理解正确,您想要一种使用那些标准内联程序的方法,您显然在脚本中剪切和粘贴,然后以某种方式将第四个参数传递到您的主 Perl 程序中。
答案是否定的。system命令生成一个 shell 以在分叉的进程中运行该命令。父进程无法访问该分叉进程中的任何 Perl 变量。您可以在内联程序中使用 Perl 变量,这些变量可以在主程序中设置。
my $file1 = "data1.1";
my $file2 = "data2.1"
system qq( perl -ne '/^.QQQ/ig && print' abc.l > $file1 );
system qq( perl -ne '/.SSS/ig && print' $file1 >$file2; );
但是,如果这是您经常做的事情,那么我强烈建议您创建自己的包:
use local::fix_files qw(fix_QQQ fix_SSS);
fix_QQQ ( "abc.1", "data1.1" );
fix_SSS ( "data1.1", "data2.1 );