perl 二维数组的用法实例

                          由于Perl的二维数组比较难理解,故下面将使用实例来说明二维数组在Perl 中是如何应用的。

 

 

#! /usr/bin/perl -w
use warnings;
use strict;

##二维数组的建立,访问,参数传递
my @tmp=&GetArrayData();

##数组作为参数传递给函数
foreach my $rslt(@tmp)
{
  ##模拟把数组的数据付给列表
  my ($data1,$data2,$data3)=@{$rslt};
  print " list for : $data1,$data2,$data3";
  print "\n";
  &printArry(\@{$rslt});
}

print "direct access array values:".$tmp[0][1];
print "\n";

print "direct access array values:".$tmp[0]->[1];

print "\n";

### 添加新列到已经存在的行
push @{$tmp[0]},1,1,1;

 

foreach my $rslt(@tmp)
{
  &printArry(\@{$rslt});
}

 

####数组的排序,按多列排序:

### 排序:
my @tmp_a=(sort {$a->[0] <=> $b->[0] || $a->[3] cmp $b->[3]} @tmp);

###意思是先按第一个数字的升序来排列,如果相等则按第三个字母升序来排列。


#######################################################################
sub GetArrayData(){
## 函数返回二维数组
my @rslt=();
my @rows=();
my $i=0;
@rows=(1,4,7,'b');
$rslt[$i]=[ @rows];
$i++;
@rows=(2,5,8,'a');
$rslt[$i]=[ @rows];

return @rslt;
}

sub printArry()
{
##模拟二维数组输出
my ($var)=@_;
my ($data1,$data2,$data3,$data4)=@{$var};
print "list by sub: $data1,$data2,$data3,$data4";
print "\n";
}

 

以上代码已经验证过可行性。

 

Perl 中,二维数组可以通过引用的方式实现。为了对二维数组中的元素进行去重,我们可以利用哈希表(`%hash`)来存储和比较 `b` 数组的前 8 个元素。以下是具体的实现代码: ```perl #!/usr/bin/perl use strict; use warnings; # 定义一个二维数组 a,其中每个元素是数组 b my @a = ( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 11, 12], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 13, 14] ); # 使用哈希表去重 my %seen; my @unique_a = grep { my $key = join(",", @$_[0..7]); # 取数组 b 的前 8 个元素作为 key !$seen{$key}++; # 如果 key 没有出现过,则保留该数组 } @a; # 输出去重后的二维数组 foreach my $row (@unique_a) { print "[", join(", ", @$row), "]\n"; } ``` ### 给出解释 1. **定义二维数组**: - 我们通过引用的方式定义了一个二维数组 `@a`,其中每个元素是一个匿名数组(即 `b` 数组)。 - 每个 `b` 数组包含 10 个元素。 2. **去重逻辑**: - 我们使用哈希表 `%seen` 来记录已经遇到过的 `b` 数组的前 8 个元素。 - 对于每个 `b` 数组,我们提取其前 8 个元素,并用 `join` 函数将它们拼接成一个字符串作为哈希表的键。 - `grep` 函数会遍历数组 `@a`,对于每个子数组,检查其对应的键是否已经在 `%seen` 中出现过。如果未出现过,则将其保留在结果中,并将该键标记为已见过。 3. **输出结果**: - 最后,我们遍历去重后的二维数组 `@unique_a`,并打印每个子数组的内容。 运行上述代码后,输出将是: ``` [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值