كيف يمكنني طباعة عناصر فريدة في مجموعة بيرل؟

StackOverflow https://stackoverflow.com/questions/439647

  •  22-07-2019
  •  | 
  •  

سؤال

أقوم بدفع العناصر إلى مصفوفة أثناء بيان 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 (انظر ما يسمى ب <لأ href = "https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod#Baby-cart" يختلط = "نوفولو"> "عربة الطفل" المشغل ):

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

في أحدث الإصدارات من بيرل، يمكنك تمرير keys على hashref، ويمكنك استخدام بدائل غير المدمرة:

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

وإلا، grep أو $seen[$_]++ حلول مكان آخر قد يكون من الأفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top