登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

@ARGV:perl命令行参数  

2011-03-26 19:22:04|  分类: perl&bioperl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

当perl脚本运行时,从命令行上传递给它的参数存储在内建数组@ARGV中,@ARGV是PERL默认用来接收参数的数组,可以有多个参数,$ARGV[0]是表示接收到的第一个参数,$ARGV[1]表示第二个。
使用方法为:
perl   my.pl $ARGV[0]  $ARGV[1]
看一个具体例子:
比如文件1的内容:
1320238
1320239
1320239
1320238
1320238
1320238
1320235
1320237

文件2的内容:
102 5709072117805887 4001 1301854
102 5709072117807510 4001 1320292
102 5709072117838653 4001 1301857
102 5709072117814280 4001 1305832
102 5709072117839397 4001 1310673
102 5709072117839335 4001 1311270

我想先把文件1的内容读取出来,然后读取文件二的内容,在读取文件2的内容的时候,文件2的最后一列需要包含在上文件1内。
[root@localhost ~]$ perl  ex.pl 1.txt 2.txt
[root@localhost ~]$ cat ex.pl
#!/usr/bin/perl
use strict;

open(ONE,"$ARGV[0]") or die $!;
open(TWO,"$ARGV[1]") or die $!;

my %hash;
while (<TWO>) {
    chomp;
    my @line=split;
    my $column4=$line[3];
    $hash{$column4}=$_;
}

while (<ONE>) {
     chomp;
     print $hash{$_} if defined $hash{$_};
    
}

print"\n";

关于 perl 中命令执行以及@ARGV的使用

 

在 perl 中提供了很方便的命令行执行的工具。 `` (键盘上 Tab 建上边的键)可以用于执行 perl 命令行。

下面就以一个例子来说明具体的用法。

 

程序一( Demo.pl )

#!/usr/bin/perl

 

use strict ;

use warnings ;

 

if ( $ ARGV [ 0 ] eq "1" ){

    `perl F:\\Demo2.pl` ;

} else {

    `perl F:\\Demo3.pl` ;

}

 

程序二 (Demo2.pl)

#!/usr/bin/perl -w

 

use strict ;

use warnings ;

 

unless ( open ( FILE_F , ">>F:\\log2.log" )){

    print "Can not open the file" ;

}

 

print FILE_F "Demo2" ;

 

close ( FILE_F );

 

程序三 (Demo3.pl)

#!/usr/bin/perl

 

use strict ;

use warnings ;

 

unless ( open ( FILE_F , ">>F:\\log3.log" )){

    print "Can not open the file" ;

}

 

print FILE_F "Demo3" ;

 

close ( FILE_F );

 

程序解释

我们在命令行中执行使用 perl 命令( perl ${Demo.pl 所在的目录 }\\Demo1.pl ,例如 perl F:\\Demo1.pl 1 )来执行程序一 ,然后如果后面的参数为 1 ,则执行 ` perl F:\\Demo2.pl ` , perl 就会执行 F 盘目录下的 Demo2.pl ,执行 Demo2.pl 后 Demo2.pl 就会在 F 盘目录下建立文件 log2.log ,并写入“ Demo2 ”;如果后面的参数不是 1 ,则执行 ` perl F:\\Demo3.pl ` , perl 就会执行 F 盘目录下的 Demo3.pl ,执行 Demo3.pl 后 Demo3.pl 就会在 F 盘目录下建立文件 log3.log ,并写入“ Demo3 ”。

 

同时,我们也看到了 @ARGV 的使用方法。

@ARGV 就是接受 perl 的命令行执行参数。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gan690416372/archive/2010/01/10/5167501.aspx

 

 Perl 会把命令行参数保存到特殊数组ARGV 中,该数组的下标从0 开始,ATGV[0] 在这里并不代表程序名,而是代表着脚本后面的第一个词,,变量$#ARGV 在Perl 中负责保存数组最后一个元素的编号,而不是数组元素数目.因此,命令行参数的总数是$#ARGV+1。$#ARGV变量的初始值为-1。

 

示例10.27
(The Script)
#!/usr/bin/perl
1 die "$0 requires an argument.\n" if $#ARGV < 0 ;
# Must have at least one argument
2 print "@ARGV\n"; # Print all arguments
3 print "$ARGV[0]\n"; # Print first argument
4 print "$ARGV[1]\n"; # Print second argument
5 print "There are ", $#ARGV + 1," arguments.\n";
# $#ARGV is the last subscript
6 print "$ARGV[$#ARGV] is the last one.\n"; # Print last arg
(Output)
$ perl.arg
2 perl.arg requires an argument.
$ perl.arg f1 f2 f3 f4 f5
2 f1 f2 f3 f4 f5
3 f1
4 f2
5 There are 5 arguments.
6 f5 is the last one.
解释
1. 如果没有收到任何命令行参数,则通过die 函数退出脚本。特殊变量$0 负责保存Perl 脚本
的名称,即Perl.arg。
2. 打印数组@ARGV 的内容。
3. 打印第一个参数值,它不是脚本名。
4. 打印第二个参数值。
5. $#ARGV 变量含有最后一个参数的下标。由于下标是从0 开始的,因此$#ARGV+1 表示参
数的总数,而非脚本名的长度。
6. 由于$#ARGV 变量含有最后一个参数的下标,因此$ARGV[$#ARGV] 是数组@ARGV 的最
后一个元素的值。
标量
$ARGV
数组
@ARGV
头文件
ARGV
$0 脚本名称$#ARGV 最后一个元素的下标数值
图10-4 有关ARGV 的内容

  评论这张
 
阅读(10539)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018