对于我正在输入的程序
{'4#11','6#0','5#2','6#1','7#1','5#11','5#11','5#10','5#8'}
从命令行。
此输入应作为数组传递到子程序中,而不会更改元素的顺序
sub get_height {
my (@input1)= @_;
}
如何在不改变perl中元素顺序的情况下将输入转换为数组?如果我的程序被命名为four.pl并且我正在执行该程序
perl four.pl {'4#11','6#0','5#2','6#1','7#1','5#11','5#11','5#10'}
然后在命令行中,参数存储在$ARGV[0]
中。我的问题是它会被存储为匿名哈希吗?
然后我调用子程序get_height
,如下所示:
my $num = get_height($ARGV[0]);
在子程序中,如何将此列表更改为数组,以便列表中元素的顺序不会更改?
以下是完整的代码:
#!/usr/bin/perl
sub get_height {
my (@input1)= @_;
print "==>@input1\n";
my @array = undef;
my @num = undef;
my $pair = 0;
foreach my $val (@input1)
{
@num = split (/#/,$val);
return -1 if (($num[0] < 4) or ($num[0]>7));
return -1 if (($num[1] < 0) or ($num[1]>11));
$val =~ s/#/./g;
push(@array,$val);
}
for(my $i = 0; $i < $#array; $i++)
{
for(my $j = $i+1; $j < $#array+1; $j++)
{
if($array[$i] > $array[$j])
{
$pair++;
}
}
}
return $pair;
}
my $num = get_height($ARGV[0]);
print "Total pair is $num\n";
如果我正在执行代码 perl four.pl {4#11,6#0,5#2,6#1,7#1,5#11,5#11,5#10},我将输出为-1。
但我应该将输出设为18。
答案 0 :(得分:0)
参数行是你的@ARGV,所以第一个参数是$ ARGV [0]
sub get_height {
my $input1 = $_[0];
}
&get_height($ARGV[0])
编辑:如果您无法改变方式,则调用该函数然后您可以执行此操作
sub get_height{
my (@input1) = @_;
}
get_height(@ARGV);
否则,如果你想逐个传递你的号码,那么你可以这样做
for(my $i=0; $i<=$#ARGV; $i++){
get_height($ARGV[$i])
}
答案 1 :(得分:0)
使用您指定的输入格式,@ARGV
如下所示:
print "@ARGV\n";
4#11 6#0 5#2 6#1 7#1 5#11 5#11 5#10 5#8
即。 $ARGV[0] = '4#11'
,$ARGV[1] = '6#0'
等
这是一个数组,而不是哈希。
请注意,这只是因为您使用的shell在将输入传递给perl之前扩展了输入:
$ echo {'4#11','6#0','5#2','6#1','7#1','5#11','5#11','5#10','5#8'}
4#11 6#0 5#2 6#1 7#1 5#11 5#11 5#10 5#8
将输入作为由空格分隔的值列表传递,而不是依赖于shell扩展,将更加便携:
perl four.pl '4#11' '6#0' '5#2' '6#1' '7#1' '5#11' '5#11' '5#10' '5#8'
您可以像这样传递对整个数组的引用:
use strict;
use warnings;
sub get_height {
my @input1 = @{$_[0]}; # dereference first argument as array
print $input1[0]; # output: 4#11
print $input1[1]; # output: 6#0
}
get_height (\@ARGV);
这是您的脚本的工作副本,它返回您期望的结果。我做了一些改变,希望这些改变是相当不言自明的。如果您对此不确定,请告诉我:
#!/usr/bin/env perl
use strict;
use warnings;
sub get_height {
my @heights = @{$_[0]};
print "==>@heights\n";
my $pair = 0;
foreach my $val (@heights) {
my ($feet, $inches) = split /#/, $val;
return -1 if $feet < 4 or $feet > 7;
return -1 if $inches < 0 or $inches > 11;
}
s/#/./ for @heights;
for my $i (0..$#heights-1) {
for my $j ($i+1..$#heights) {
++$pair if $heights[$i] > $heights[$j]
}
}
return $pair;
}
my $num = get_height(\@ARGV);
print "Total pair is $num\n";