সতর্কতা : পাঠ্যের প্রাচীর কাছে আসছে। এটি সময়ের সাথে আমি জড়ো হওয়া অনেকগুলি ছোট কৌশল।
আপনার সমাধানগুলি বেনামে ব্লক হিসাবে লিখুন
এটি ইতিমধ্যে উল্লেখ করা হয়েছিল তবে আমি এটি পুনরাবৃত্তি করতে চাই। টিআইওতে, আপনি শিরোনামটিতে লিখতে পারেন, কোডটিকে my $f =সঠিকভাবে ব্লক করতে পারেন এবং ফুটারটি একটি দিয়ে শুরু করতে পারেন ;। কাজটি সম্পন্ন করার এটি সবচেয়ে সংক্ষিপ্ততম উপায় বলে মনে হয় (যেহেতু আপনাকে কোনও ইনপুট পড়ার বিষয়ে চিন্তা করার দরকার নেই, এটি আপনাকে যুক্তি দিয়ে দেওয়া হয়েছে)।
আর একটি দুর্দান্ত উপায় হ'ল -nবা -pস্যুইচটি ব্যবহার করছে তবে এটি টিআইওতে কাজ করার কোনও উপায় খুঁজে পেল না।
আর্গুমেন্ট পাস করার জন্য কোলন সিনট্যাক্স ব্যবহার করুন
এটির পরিবর্তে thing.method(foo,bar), আপনি thing.method:foo,bar1 টি অক্ষর করতে এবং সংরক্ষণ করতে পারেন । দুর্ভাগ্যক্রমে, আপনি সুস্পষ্ট কারণে ফলাফলের জন্য অন্য কোনও পদ্ধতিতে কল করতে পারবেন না, সুতরাং এটি কেবলমাত্র একটি ব্লকের শেষ পদ্ধতির জন্য ব্যবহার করা বোধগম্য।
$_আপনি যতটা পারেন ব্যবহার করুন
কখনও কখনও এটির জন্য বেশ কয়েকটি পৃথক যুক্তির চেয়ে একক তালিকার যুক্তি নেওয়া ভাল। অ্যাক্সেস করার সময় $_, আপনি কেবল বিন্দু দিয়ে শুরু করার মাধ্যমে এটিগুলিতে পদ্ধতিগুলি কল করতে পারেন: যেমন .sortসমান $_.sort।
যাইহোক, মনে রাখবেন যে প্রতিটি ব্লক তার নিজস্ব হয়ে যায় $_, তাই বাইরের ব্লকের পরামিতিগুলি অভ্যন্তরীণ অঞ্চলে প্রচার করে না। আপনার যদি কোনও অভ্যন্তরীণ ব্লক থেকে মূল ফাংশনের পরামিতিগুলি অ্যাক্সেস করার প্রয়োজন হয়, ...
^আপনি যদি ব্যবহার করতে না পারেন তবে ভেরিয়েবলগুলি ব্যবহার করুন$_
একটি ঢোকান ^sigil এবং পরিবর্তনশীল নাম, ভালো মধ্যে: $^a। এগুলি কেবল একটি ব্লকের ভিতরে কাজ করে। সংকলকটি প্রথমে গণনা করে যে এগুলির মধ্যে আপনার কতগুলি ব্লকের রয়েছে, সেগুলি অভিধানে বাছাই করে এবং তারপরে প্রথম যুক্তিকে প্রথমটির সাথে দ্বিতীয়টি দ্বিতীয়টিকে দ্বিতীয় হিসাবে নির্ধারণ করে। ^চাহিদা শুধুমাত্র পরিবর্তনশীল প্রথম সংঘটনে ব্যবহৃত হবে। সুতরাং {$^a - $^b}2 টি স্কেলার নেয় এবং সেগুলি বিয়োগ করে। একমাত্র জিনিসটি হ'ল বর্ণানুক্রমিক ক্রম, তাই {-$^b + $^a}একই জিনিসটি করে।
যদি আপনি কখনই বিন্দু ব্লক সিনট্যাক্স ব্যবহার করার মতো অনুভব করেন (যেমন ->$a,$b {$a.map:{$_+$b}}) তবে আপনি ব্লকের শুরুতে বোগাস স্টেটমেন্ট লিখে ^প্রতিটি যুক্তির জন্য যা আপনি প্রধান ব্লকে (যেমন {$^b;$^a.map:{$_+$b}}) ব্যবহার করতে যাচ্ছেন না তা ব্যবহার করে লেখার চেয়ে ভাল (নোট) এটি গল্ফ করার আরও ভাল উপায় {$^a.map(*+$^b)}I আমি কেবল ধারণাটি প্রদর্শন করতে চেয়েছিলাম))
অপারেটরগুলি খুব শক্তিশালী এবং প্রায়শই তারা জিনিসগুলি সংক্ষিপ্ত করার উপায়। বিশেষ করে মেটা-অপারেটার (অপারেটার যে আর্গুমেন্ট হিসাবে অপারেটরদের নিতে) [], [\], X, <</ >>এবং Zআপনার মনোযোগ মূল্য আছে। ভুলে যাবেন না যে একটি মেটা-অপ্ট অন্য একটি মেটা-অপটিকে একটি যুক্তি হিসাবে গ্রহণ করতে পারে (যেমন XZ%%আমি এখানে ব্যবহার করতে সক্ষম হয়েছিলাম )। আপনি >>একটি পদ্ধতি কলের জন্যও ব্যবহার করতে পারেন , যা মানচিত্রের চেয়ে অনেক সস্তা হতে পারে ( @list>>.methodপরিবর্তে @list.map(*.method), তবে সাবধান, তারা একই নয়! )। এবং, অবশেষে, আপনি বাইনারি ব্যবহার করার আগে << >>মনে রাখবেন যে Zপ্রায়শই খুব কম অক্ষরগুলিতে একই কাজ করবে।
আপনি যদি একে অপরের উপর প্রচুর মেটা-অপ্স স্থাপন করেন তবে আপনি বর্গাকার বন্ধনী ব্যবহার করে অগ্রাধিকার নির্দিষ্ট করতে পারেন []। যখন আপনি এতগুলি অপারেটরকে পাইল করেন তখন এটি আপনাকে বাঁচাতে পারে যে এটি সংকলককে বিভ্রান্ত করে। (এটি প্রায়শই ঘটে না))
পরিশেষে, আপনি, bool, int বা কার্যক্রম থেকে নিগৃহীত জিনিস প্রয়োজন হলে পদ্ধতি ব্যবহার করবেন না .Bool, .Intএবং .Str, বরং অপারেটার ?, +এবং ~। বা আরও ভাল, কেবল এন্টারগুলিতে জোর করে তাদের গাণিতিক অভিব্যক্তিতে রাখুন। একটি তালিকা দৈর্ঘ্য পেতে সংক্ষিপ্ততম উপায় +@list। আপনি যদি কোনও তালিকার দৈর্ঘ্যের শক্তির 2 টি গণনা করতে চান তবে কেবল বলুন 2**@listএবং এটি ডান জিনিসটি করবে।
ফ্রি স্টেট ভেরিয়েবল ব্যবহার করুন $, @এবং%
প্রতিটি ব্লকে, $(বা @বা %) এর প্রতিটি ঘটনাই একটি চকচকে নতুন স্কেলার (বা অ্যারে, বা হ্যাশ) রাষ্ট্র ভেরিয়েবল (এমন একটি ভেরিয়েবল যার মান ব্লকের কলগুলিতে অব্যাহত থাকে) বোঝায়। আপনার যদি এমন কোনও রাষ্ট্রের পরিবর্তনশীল প্রয়োজন যা উত্স কোডে একবারে উল্লেখ করা দরকার তবে এই তিনটি আপনার বড় বন্ধু। (প্রায়শই $।) উদাহরণস্বরূপ, বিপরীত ম্যাথ সাইকেল চ্যালেঞ্জে এটি কোনও অ্যারে থেকে চক্রাকারে অপারেটরগুলি বেছে নিতে ব্যবহার করা যেতে পারে যা দ্বারা সূচকযুক্ত $++%6।
map, grepএবং অন্যান্য উপ ফর্ম ব্যবহার করুন ।
এর মানে হল যে: বরং না map {my block},listচেয়ে list.map({my block})। এমনকি আপনি যদি ব্যবহার করতে পরিচালনা করেন তবে list.map:{my block}এই দুটি পন্থা একই সংখ্যক বাইটে প্রকাশিত হয়। এবং প্রায়শই, কোনও পদ্ধতিতে কল করার সময় আপনাকে তালিকার প্রথম বন্ধনী তৈরি করতে হবে, তবে সাবকে কল করার সময় নয়। সুতরাং উপ পদ্ধতিটি সর্বদা ভাল বা কমপক্ষে পদ্ধতিটির মতোই বেরিয়ে আসে।
এখানে কেবল ব্যতিক্রম হ'ল mapপ্যাড, grepপ্যাড এবং এই জাতীয় বস্তুটি কখন প্রবেশ করতে হবে $_। তাহলে .map:{}স্পষ্টতই মারধর করে map {},$_।
ব্যবহারের সংযোগস্থলের ( &এবং |) পরিবর্তে &&এবং ||।
স্পষ্টতই, তারা 1 বাইট সংক্ষিপ্ত। অন্যদিকে, তাদের অবশ্যই বুলিয়ান প্রসঙ্গে জোর করে ভেঙে ফেলা উচিত। এটি সর্বদা একটি দিয়ে করা যায় ?। এখানে আপনার এমন একটি মেটা-অপের বিষয়ে সচেতন হওয়া উচিত !opযা বুল প্রসঙ্গটি জোর করে, opফলাফলটি ব্যবহার করে এবং অবহেলা করে।
আপনার যদি একটি তালিকা থাকে এবং আপনি এটি একটি জংশনে রূপান্তর করতে চান, [&]এবং ব্যবহার করবেন না [|]। পরিবর্তে ব্যবহার করুন .anyএবং .all। এমনও রয়েছে .noneযা জংশন অপস দ্বারা খুব সহজেই নকল করা যায় না।
say (3² + 4², 2²⁰, 5⁻²)==>(25 1048576 0.04)। আপনি যেমন ইউনিকোডের অপব্যবহার করতে পারেন তার সম্পূর্ণ তালিকাটি এখানে রয়েছে: ডকস.পিয়ারল /.৩/১১৮৫ ভাষা / ইউনিকোড_টেক্সাস ।