如何在Perl脚本中通过$ARGV[]指定数组并用于foreach循环?
Perl通过命令行参数选择数组并遍历的解决方案
你当前的代码没法实现需求,核心问题是:foreach my $string ($ARGV[0])只是遍历命令行传入的字符串本身(比如你运行perl script.pl array_1时,$ARGV[0]是字符串"array_1",不是数组@array_1),自然没法遍历目标数组的元素。
下面给两种可行的解决方法,优先推荐第一种更安全的实现:
方法一:用哈希映射数组名与数组(推荐)
通过哈希将数组名字符串和对应数组的引用关联,既安全又易维护:
# 定义目标数组 my @array_1 = ("abc", "home", "city"); my @array_2 = ("state", "planet", "stars"); # 创建哈希,键是要传入的数组名字符串,值是数组引用 my %array_map = ( 'array_1' => \@array_1, 'array_2' => \@array_2, ); # 校验命令行参数是否合法 die "请指定有效数组名:array_1 或 array_2\n" unless $ARGV[0] && exists $array_map{$ARGV[0]}; # 获取目标数组并遍历 my $target_arr = $array_map{$ARGV[0]}; foreach my $string (@$target_arr) { print "$string\n"; }
使用方式
运行脚本时传入数组名字符串即可:
# 遍历array_1 perl your_script.pl array_1 # 遍历array_2 perl your_script.pl array_2
方法二:符号引用(不推荐)
这种方法需要关闭严格模式下的引用检查,虽然能实现功能,但存在安全风险(比如传入恶意字符串可能访问到其他变量),仅作了解:
my @array_1 = ("abc", "home", "city"); my @array_2 = ("state", "planet", "stars"); # 限制输入只能是指定的数组名,降低风险 die "请指定数组名:array_1 或 array_2\n" unless $ARGV[0] =~ /^array_[12]$/; # 关闭严格引用检查,使用符号引用 no strict 'refs'; foreach my $string (@{$ARGV[0]}) { print "$string\n"; } use strict 'refs'; # 用完恢复严格模式
内容的提问来源于stack exchange,提问作者vikas
相关产品推荐
相关产品推荐

