题
我一个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";
}
其他提示
最好的办法是使用一个(基本上)内置工具,像uniq的(如innaM描述)一>
如果你没有使用uniq的能力,要维持秩序,您可以使用grep来模拟。
my %seen;
my @unique = grep { ! $seen{$_}++ } @faculty;
# printing, etc.
此第一给你一个散列,其中每个键是每个条目。然后,你遍历每个元素,统计其中有多少有,并添加第一个。 (更新与由Brian d FOY评论)
我建议将其推入的散列。 像这样:
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 %hash;
@hash{@faculty}=1;
my @unique=keys %hash;
如果你想避免宣布一个新的变量,你可以用某种方式未公开的全局变量%_
@_{@faculty}=1;
my @unique=keys %_;
如果需要以任何方式处理的教师列表,地图在阵列上转换为用于键聚结的散列,然后分选键是另一种好方法:
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[$_]++
溶液别处可能是优选的。