perl中的匿名散列到数组

时间:2014-08-05 11:57:43

标签: arrays perl

对于我正在输入的程序

{'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。

2 个答案:

答案 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";