写ref="/tag/2034/" style="color:#C468A7;font-weight:bold;">Perl脚本时,经常需要根据不同的场景调整行为。比如一个处理日志的脚本,有时要分析昨天的数据,有时又要调试输出详细信息。如果每次都要进代码里改变量,那太麻烦了。这时候,命令行参数就能派上用场。
基本用法:@ARGV数组
Perl把传给脚本的命令行参数存放在一个叫@ARGV的特殊数组里。你不需要引入任何模块,直接就能用。比如有这样一个脚本parse_log.pl:
#!/usr/bin/perl
foreach my $arg (@ARGV) {
print "收到参数: $arg\n";
}
运行时输入:
perl parse_log.pl access.log --verbose -d
输出就会是:
收到参数: access.log
收到参数: --verbose
收到参数: -d
解析带选项的参数
实际使用中,我们更习惯用-v或--file=xxx这样的格式。虽然可以用手动判断,但推荐用Getopt::Long模块,写起来更清晰。
#!/usr/bin/perl
use Getopt::Long;
my $verbose = 0;
my $logfile;
my $port = 8080;
GetOptions(
'verbose' => \$verbose,
'logfile=s' => \$logfile,
'port=i' => \$port,
);
print "日志文件: $logfile\n" if $logfile;
print "端口: $port\n";
print "详细模式已开启\n" if $verbose;
这样运行:
perl server.pl --logfile=access.log --port=3000 --verbose
脚本就能自动识别各个选项。其中s表示字符串类型,i是整数,布尔值如verbose默认为真(出现即为真)。
结合端口映射场景的实际例子
假设你在本地跑了个服务,默认监听3000端口,想通过脚本自动配置SSH端口转发。你可以写个Perl脚本接受目标主机和外网端口:
#!/usr/bin/perl
use Getopt::Long;
my $host = 'localhost';
my $local_port = 3000;
my $remote_port = 8080;
GetOptions(
'host=s' => \$host,
'local=i' => \$local_port,
'remote=i' => \$remote_port,
);
my $cmd = "ssh -R $remote_port:$host:$local_port user@gateway.example.com";
print "执行命令: $cmd\n";
# system($cmd); # 实际执行时再取消注释
调用时就很直观:
perl tunnel.pl --host=localhost --local=3000 --remote=9001
输出:
执行命令: ssh -R 9001:localhost:3000 user@gateway.example.com
这种写法在团队协作中特别有用,别人一看命令就知道你要做什么,不用翻代码。
小贴士
多个参数可以合并写,比如-v -p 80,也可以写成-vp 80(前提是支持)。另外建议在脚本开头加个帮助信息,当用户输入--help时显示用法,提升体验。