我一个while语句期间推动元件成阵列。每个元素都是一个老师的名字。这里结束了在阵列中被重复老师的名字时,循环结束。有时,他们不正确的阵列中彼此相邻,有时他们是

我怎样才能数组中只打印唯一值后的成品获取值被推到了吗?无需每次解析整个阵列我想打印的元素。

下面有一切之后的码已被推入数组:

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
有帮助吗?

解决方案

use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}

其他提示

我建议将其推入的散列。 像这样:

my %faculty_hash = ();
foreach my $facs (@faculty) {
  $faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");

@array1 = grep { ! $seen{ $_ }++ } @array1;

print "@array1\n"; 

此问题得到解答与在的perldoc多种解决方案。只要输入在命令行:

perldoc -q duplicate

请注意:某些含散列的答案将改变阵列的排序。哈希不要有任何种类的顺序,因此得到键或值将与未定义的排序列表。

此doen't应用于grep { ! $seen{$_}++ } @faculty

这是一个一个衬里命令在它出现为了打印唯一的行。

perl -ne '$seen{$_}++ || print $_' fileWithDuplicateValues

我刚发现陈腐3衬里,享受

my %uniq; 
undef @uniq(@non_uniq_array); 
my @uniq_array = keys %uniq; 

如果需要以任何方式处理的教师列表,地图在阵列上转换为用于键聚结的散列,然后分选键是另一种好方法:

my @deduped = sort keys %{{ map { /.*/? ($_,1):() } @faculty }};
print join("\n", @deduped)."\n";

您通过改变用于选择或解析,并相应地捕获/.*/正则表达式处理的列表中,并且可以输出一个或多个突变,非唯一通过使($_,1):()每次穿越键任意复杂。

如果您需要与正则表达式的取代来修改在飞行中的数据,比方说,从名称(s/\.//g)除去的点,然后取代根据上述模式将原始@faculty阵列变异由于$_混叠。您可以通过使$_阵列的匿名副本避开@faculty走样(见所谓的 “婴儿车” 操作符):

my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; ($_,1)}:()} @{[ @faculty ]} }};
print join("\n", @deduped)."\n";
print "Unmolested array:\n".join("\n", @faculty)."\n";

在更近的版本的Perl,可以传递keys一个hashref,并且可以使用非破坏性取代:

my @deduped = sort keys { map { /.*/? (s/\.//gr,1):() } @faculty };

否则,grep$seen[$_]++溶液别处可能是优选的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top