একটি নগ্ন হাড় সমাধান
আসুন একটি সিকোয়েন্সের সংক্ষিপ্তসার মুদ্রণের জন্য খুব সাধারণ সমাধান দিয়ে শুরু করি। আপনি আপনার প্রশ্নের সাথে যুক্ত হওয়া সুনির্দিষ্ট বিষয়গুলির সাথে এটি ব্যবহার করে না তবে এটি একটি ভাল সূচনা পয়েন্ট:
sub seq-range-gist ( @seq ) {
my @pairs = @seq.pairs;
join "\n", @pairs.head(3)».gist, '...', @pairs.tail(2)».gist
}
এর বিপরীতে .kv
, যা তার আগমনকারীকে ফর্মে রূপান্তর করে key1, value1, key2, value2, key3, value3, ...
, অর্থাত্ elements টি উপাদানের যদি তার দাওয়াতটিতে 3 টি উপাদান থাকে, তবে তার নিমন্ত্রককে .pairs
ফর্মে রূপান্তর করে key1 => value1, key2 => value2, key3 => value3, ...
।
আমি আংশিক .pairs
পরিবর্তে ব্যবহার করেছি .kv
কারণ এর অর্থ ছিল আমি কোডটিতে ».gist
পরে ব্যবহার করতে পারলাম অনায়াসে key1 => value1
প্রতিটি উপাদানটির জন্য একটি সুন্দর প্রদর্শন পেতে get আমরা নীচে এটি সংশোধন করব তবে এটি একটি ভাল পরিচয়সূত্র।
.head
এবং .tail
কল কথ্য উপায় হল একটি invocant তালিকা থেকে প্রথম ও শেষ এন উপাদানের ছোট তালিকা তৈরি করতে হয় (প্রদত্ত এটা অলস না; যে সম্পর্কে আরো মো মধ্যে)।
এই প্রাথমিক সমাধানটি দেওয়া, say seq-range-gist (0,1 ... Inf)[^10]
প্রদর্শনগুলি:
0 => 0
1 => 1
2 => 2
...
8 => 8
9 => 9
এর পরে, আমরা "মুদ্রিত আউটপুট থেকে কেবলমাত্র প্রথম উপাদানটি ফেলে দিতে" সক্ষম হতে চাই। দুর্ভাগ্যজনকভাবে say seq-range-gist (0,1 ... Inf)[1..9]
প্রদর্শন:
0 => 1
1 => 2
2 => 3
...
7 => 8
8 => 9
=>
আসল ক্রমের সংখ্যাটি বজায় রাখতে আমরা বাম দিকের নম্বরটি চাই । এটি সক্ষম করতে আমরা যে পরিসরটি বের করতে চাই তা থেকে অন্তর্নিহিত ক্রমটি বিভক্ত করি। আমরা একটি দ্বিতীয় পরামিতি / যুক্তি যুক্ত করি @range
, এবং [@range]
সাব এর দ্বিতীয় লাইনে যুক্ত করি:
sub seq-range-gist ( @seq, @range ) {
my @pairs = @seq.pairs[@range];
এখন আমরা say seq-range-gist (0,1 ... Inf), 1..9
প্রদর্শন করতে লিখতে পারি :
1 => 1
2 => 2
3 => 3
...
8 => 8
9 => 9
আপনার প্রশ্নে আপনি aINDEX = VALUE
পরিবর্তে ফর্ম্যাটটি ব্যবহার করেছেন INDEX => VALUE
। গিস্টটি অনুকূলিতকরণের জন্য, আমরা একটি তৃতীয় &gist
রুটিন প্যারামিটার / যুক্তি যুক্ত করি এবং অনুরোধ করি যে বিল্ট ইন .gist
পদ্ধতিটির পরিবর্তে :
sub seq-range-gist ( @seq, @range, :&gist ) {
my @pairs = @seq.pairs[@range];
join "\n", @pairs.head(3)».&gist, '...', @pairs.tail(2)».&gist
}
নোট কিভাবে দেহের "পদ্ধতি" আমন্ত্রণ seq-range-gist
সাব এখন .&gist
না .gist
। সিনট্যাক্স .&foo
একটি বস্তুর পূজা সাব &foo
(যা সাধারণত শুধু লিখে প্রার্থনা করা হয় foo
), বাম invocant ক্ষণস্থায়ী .
হিসেবে $_
সাব আর্গুমেন্ট প্রাপ্ত করতে।
এও নোট করুন যে আমি &gist
পরামিতিটির সাথে একটি এর আগে একটি নাম তৈরি করেছি :
।
সুতরাং এখন say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }
প্রদর্শন:
a1 = 1
a2 = 2
a3 = 3
...
a8 = 8
a9 = 9
পলিশ যোগ করা হচ্ছে
এই উত্তরটির বাকী অংশটি হ'ল পাঠকদের জন্য যারা পলিশ সম্পর্কে যত্নশীল তাদের জন্য বোনাস উপাদান।
say seq-range-gist (0, 1, 2, 3), ^3
প্রদর্শন:
0 => 0
1 => 1
2 => 2
...
1 => 1
2 => 2
উফ। এমনকি যদি মাথা এবং লেজ একত্রিত করার চেয়ে আরও বেশি জোড় থাকে তবে কমপক্ষে আমরা বারবার লাইন পাইনি, এটি head, ..., tail
কেবলমাত্র এক বা দুটি উপাদান এলিডের পদ্ধতির সাহায্যে অর্থহীন হতে চাই । আসুন এই সমস্যাগুলি দূর করতে উপ-সংস্থার সর্বশেষ বিবৃতিটি পরিবর্তন করা যাক:
join "\n",
@pairs < $head + $tail + 3 # Of course, the 3 is a bit arbitrary
?? @pairs».&gist
!! (@pairs.head($head)».&gist, '...', @pairs.tail($tail)».&gist)
এরপরে, উপস্থাপনাটি কোনও ব্যাপ্তি বা সংক্ষিপ্তসার ছাড়াই ডেকে আনা হলে দরকারী কিছু করায় ভাল লাগবে। আমরা বেশিরভাগটি উপযুক্ত ডিফল্ট @range
এবং &gist
পরামিতিগুলি দিয়ে এটি ঠিক করতে পারি :
sub seq-range-gist (
@seq,
@range = @seq.is-lazy ?? ^100 !! ^@seq,
:&gist = { .gist }
) {
যদি @seq
হয় না অলস , তারপর @range
সম্পূর্ণ পরিসর ডিফল্ট @seq
। যদি @seq
হয় অসীম (যে ক্ষেত্রে এটি অলস এর), তারপর 100 পর্যন্ত ডিফল্ট জরিমানা। তবে যদি @seq
অলস হয় তবে 100 টির চেয়ে কম সংজ্ঞাযুক্ত মান পাওয়া যায় তবে? এই ক্ষেত্রে আমরা যোগ আবরণ .grep: *.value.defined
থেকে @pairs
ঘোষণা:
my @pairs = @seq.pairs[@range].grep: *.value.defined;
আর একটি সাধারণ উন্নতি হ'ল headচ্ছিক মাথা এবং লেজ পরামিতি, যা একটি চূড়ান্ত পালিশ সমাধানের দিকে নিয়ে যায়:
sub seq-range-gist (
@seq,
@range = @seq.is-lazy ?? ^100 !! ^@seq,
:$head = 3,
:$tail = 2,
:&gist = { .gist }
) {
my @pairs = @seq.pairs[@range].grep: *.value.defined;
join "\n",
@pairs <= $head + $tail + 2
?? @pairs».&gist
!! (@pairs.head($head)».&gist, '...', @pairs.tail($tail)».&gist)
}