উত্তর:
পেরফাকাক 4-তে প্রদর্শিত হিসাবে আপনি এর মতো কিছু করতে পারেন :
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my @array = qw(one two three two three);
my @filtered = uniq(@array);
print "@filtered\n";
আউটপুট:
one two three
আপনি যদি কোনও মডিউল ব্যবহার করতে চান তবে uniq
ফাংশনটি চেষ্টা করে দেখুনList::MoreUtils
my
এই সুযোগে একটি যুক্তিযুক্ত, তাই এটি ঠিক আছে। বলা হচ্ছে, সম্ভবত আরও বর্ণনামূলক পরিবর্তনশীল নামটি বেছে নেওয়া যেতে পারে।
$::a
এবং $::b
, তাই না?
sub uniq { my %seen; grep !$seen{$_}++, @_ }
এটি কোনও ব্যয় ছাড়াই অর্ডার সংরক্ষণ করে এটি একটি ভাল বাস্তবায়ন। বা আরও ভাল, তালিকা :: MoreUtils থেকে একটি ব্যবহার করুন।
পার্ল ডকুমেন্টেশন এফএকিউগুলির একটি দুর্দান্ত সংগ্রহ নিয়ে আসে। আপনার প্রশ্ন প্রায়শই জিজ্ঞাসা করা হয়:
% perldoc -q duplicate
উপরের কমান্ডের আউটপুট থেকে উত্তর, অনুলিপি এবং আটকানো নীচে প্রদর্শিত হবে:
/Usr/local/lib/perl5/5.10.0/pods/perlfaq4.pod এ পাওয়া গেছে আমি কীভাবে একটি তালিকা বা অ্যারে থেকে সদৃশ উপাদানগুলি সরিয়ে ফেলতে পারি? (ব্রায়ান ডি ফোয়াই অবদান) একটি হ্যাশ ব্যবহার করুন। আপনি যখন "অনন্য" বা "সদৃশ" শব্দগুলি মনে করেন, তখন ভাবুন "হ্যাশ কী"। আপনি যদি উপাদানগুলির ক্রম সম্পর্কে চিন্তা না করেন তবে আপনি ঠিক করতে পারেন হ্যাশ তৈরি করুন তারপরে কীগুলি বের করুন। কীভাবে আপনি তা গুরুত্বপূর্ণ নয় সেই হ্যাশটি তৈরি করুন: অনন্য উপাদানগুলি পেতে আপনি "কী" ব্যবহার করেন। আমার% হ্যাশ = মানচিত্র {$ _, 1} @ অ্যারে; # বা একটি হ্যাশ স্লাইস: @ হ্যাশ {@ অ্যারে} = (); # বা একটি ভবিষ্যদ্বাণী: $ হ্যাশ {$ _} = 1 ফোরচ (@ অ্যারে); আমার @ ইউনিক = কীগুলি% হ্যাশ; আপনি যদি কোনও মডিউল ব্যবহার করতে চান তবে "ইউনিিক" ফাংশনটি ব্যবহার করে দেখুন "তালিকা :: MoreUtils"। তালিকার প্রসঙ্গে এটি অনন্য উপাদানগুলি প্রদান করে, তালিকায় তাদের অর্ডার সংরক্ষণ করা। স্কেলার প্রসঙ্গে, এটি ফেরত দেয় অনন্য উপাদান সংখ্যা। ব্যবহারের তালিকা :: MoreUtils qw (uniq); আমার @ ইউনিক = ইউনিক (1, 2, 3, 4, 4, 5, 6, 5, 7); # 1,2,3,4,5,6,7 আমার $ অনন্য = ইউনিক (1, 2, 3, 4, 4, 5, 6, 5, 7); # 7 আপনি প্রতিটি উপাদান দিয়ে যেতে পারেন এবং আপনি যেগুলি দেখেছেন তা এড়িয়ে যেতে পারেন আগে. ট্র্যাক রাখতে একটি হ্যাশ ব্যবহার করুন। প্রথমবার লুপটি একটি দেখে উপাদানটি,% তে দেখা যায় যে এলিমেন্টটির কোনও কী নেই। "পরবর্তী" বিবৃতি তৈরি করে কীটি এবং অবিলম্বে এর মানটি ব্যবহার করে যা "অপরিশোধিত", তাই লুপ "ধাক্কা" অবিরত করে এবং সেই কীটির মান বাড়িয়ে তোলে। পরবর্তী লুপ একই উপাদানটি দেখার সময়, এর কীটি হ্যাশটিতে উপস্থিত রয়েছে এবং এই কীটির মানটি সত্য (যেহেতু এটি 0 বা "অপরিশোধিত" নয়) তাই পরবর্তী পুনরুক্তি যে পুনরাবৃত্তি এবং লুপ পরবর্তী উপাদান যায়। আমার @ ইউনিক = (); আমার% দেখা = (); আমার $ এলেম (@ অ্যারে) পূর্বাভাস { পরবর্তী যদি $ দেখা {$ এলেম} ++; @ ইউনিক, $ এলেম; } আপনি গ্রেপ ব্যবহার করে এটি আরও সংক্ষেপে লিখতে পারেন, এটি একই কাজ করে জিনিস। আমার% দেখা = (); আমার @ ইউনিক = গ্রেপ {! $ {_} ++} @ অ্যারে দেখেছে;
ইনস্টল তালিকা :: সিপিএএন থেকে আরও ইউটিলিটিস
তারপরে আপনার কোডে:
use strict;
use warnings;
use List::MoreUtils qw(uniq);
my @dup_list = qw(1 1 1 2 3 4 4);
my @uniq_list = uniq(@dup_list);
@dup_list
ভিতরে হওয়া উচিত uniq
কল না,@dups
আমার এটি করার স্বাভাবিক উপায় হ'ল:
my %unique = ();
foreach my $item (@myarray)
{
$unique{$item} ++;
}
my @myuniquearray = keys %unique;
যদি আপনি একটি হ্যাশ ব্যবহার করেন এবং আইটেমগুলিকে হ্যাশ যুক্ত করুন। প্রতিটি আইটেমি তালিকায় কতবার উপস্থিত হয় তা জানার বোনাস আপনারও রয়েছে।
একটি সাধারণ পার্ল ওয়ান লাইনার দিয়ে করা যায়।
my @in=qw(1 3 4 6 2 4 3 2 6 3 2 3 4 4 3 2 5 5 32 3); #Sample data
my @out=keys %{{ map{$_=>1}@in}}; # Perform PFM
print join ' ', sort{$a<=>$b} @out;# Print data back out sorted and in order.
পিএফএম ব্লক এটি করে:
@ ইন থাকা ডেটা এমএপিতে সরবরাহ করা হয়। এমএপি একটি বেনামে হ্যাশ তৈরি করে। কীগুলি হ্যাশ থেকে বের করা হয় এবং @ আউটতে ফিড করা হয়
যুক্তি: একটি হ্যাশের কেবলমাত্র অনন্য কী থাকতে পারে, সুতরাং অ্যারের উপরে পুনরাবৃত্তি করুন, অ্যারের প্রতিটি উপাদানকে কোনও মান নির্ধারণ করুন, উপাদানটিকে হ্যাশটির কী হিসাবে রাখবেন। হ্যাশটির কীগুলি রিটার্ন করুন এটি আপনার অনন্য অ্যারে।
my @unique = keys {map {$_ => 1} @array};
আমাদের কোডে একাধিকবার এই কার্যকারিতাটি ব্যবহার করার কথা যদি মনে করা হয় তবে সাব্রোটিন তৈরি করা ভাল।
sub get_unique {
my %seen;
grep !$seen{$_}++, @_;
}
my @unique = get_unique(@array);
List::MoreUtils
use List::MoreUtils qw(uniq);
my @unique = uniq(@array);
পূর্ববর্তী উত্তরগুলি এই কার্য সম্পাদনের সম্ভাব্য উপায়গুলির সংক্ষিপ্ত বিবরণ দেয়।
যাইহোক, আমি যারা জন্য একটি পরিবর্তন সুপারিশ না যত্ন সম্পর্কে গণনা সদৃশ কিন্তু কি অর্ডার যত্নশীল।
my @record = qw( yeah I mean uh right right uh yeah so well right I maybe );
my %record;
print grep !$record{$_} && ++$record{$_}, @record;
দ্রষ্টব্য যে অগ্রাহ্য করার আগে পূর্বে প্রস্তাবিত grep !$seen{$_}++ ...
বর্ধিতকরণ $seen{$_}
, সুতরাং বর্ধিততা এটি ইতিমধ্যে হয়েছে কিনা তা নির্বিশেষে ঘটে %seen
। উপরের যাইহোক, শর্ট সার্কিটগুলি যখন $record{$_}
সত্য হয়, যা একবার 'অফ' এর বাইরে শোনা যায় %record
।
আপনি এই হাস্যকরতার পক্ষেও যেতে পারেন, যা হ্যাশ কীগুলির অটোভিভিফিকেশন এবং অস্তিত্বের সুবিধা গ্রহণ করে:
...
grep !(exists $record{$_} || undef $record{$_}), @record;
এটি অবশ্য কিছু বিভ্রান্তির কারণ হতে পারে।
এবং যদি আপনি অর্ডার বা সদৃশ গণনা উভয়ের বিষয়ে চিন্তা করেন তবে আপনি হ্যাশের টুকরোগুলি এবং আমি যে কৌশলটি উল্লেখ করেছি তা ব্যবহার করে অন্য একটি হ্যাক করতে পারত:
...
undef @record{@record};
keys %record; # your record, now probably scrambled but at least deduped
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
ঝরঝরে।
এটি চেষ্টা করে দেখুন, ইউনিক ফাংশনের সঠিকভাবে কাজ করার জন্য একটি বাছাই করা তালিকা দরকার।
use strict;
# Helper function to remove duplicates in a list.
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my @teststrings = ("one", "two", "three", "one");
my @filtered = uniq @teststrings;
print "uniq: @filtered\n";
my @sorted = sort @teststrings;
print "sort: @sorted\n";
my @sortedfiltered = uniq sort @teststrings;
print "uniq sort : @sortedfiltered\n";
অনন্য হ্যাশ কীগুলির ধারণাটি ব্যবহার করে:
my @array = ("a","b","c","b","a","d","c","a","d");
my %hash = map { $_ => 1 } @array;
my @unique = keys %hash;
print "@unique","\n";
আউটপুট: acbd