পার্ল 6 এ গল্ফ করার টিপস


16

পার্ল 6 এ গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা পার্ল 6 এর সাথে অন্তত কিছুটা নির্দিষ্ট কোড কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।

দয়া করে মনে রাখবেন যে পার্ল 6 পার্ল 5 নয়, সুতরাং এই প্রশ্নটি নকল নয়। পার্ল 5 গল্ফ করার জন্য বেশিরভাগ টিপস কেবল পার্ল 6 এ প্রয়োগ হয় না।

উত্তর:


9

subআক্ষরিক এড়ানো । অনেক ক্ষেত্রে, আপনি কেবল {}কোড ব্লকের জন্য ব্যবহার করতে পারেন । উদাহরণস্বরূপ, নিম্নলিখিত কোডটি লিখবেন না।

sub ($a){$a*2}

পরিবর্তে, ব্লক বাক্য গঠন ব্যবহার করুন। এটাও আপনি ব্যবহার করতে দেয় $_, @_এবং %_স্থানধারক ভেরিয়েবল, যদি আপনি শুধুমাত্র একটি একক পরিবর্তনশীল প্রয়োজন। আপনার যদি আরও প্রয়োজন হয়, আপনি ব্যবহার করতে পারেন $^a, $^bভেরিয়েবল এবং আরও কিছু।

{$_*2}

এছাড়াও, কিছু বিরল ক্ষেত্রে, যে কোনও কোডই ব্যবহার করা সম্ভব (বিশেষত যখন আপনি সহজ মত প্রকাশ করেন)। *স্থানধারক যুক্তি প্রতিস্থাপন করে।

* *2

8

পার্ল এর একটি সত্যিই উদ্ভট বৈশিষ্ট্য রয়েছে যেখানে এটি এনডি , এনএল , এবং  নং বিভাগের সমস্ত ইউনিকোড অক্ষরকে যুক্তিযুক্ত নম্বর আক্ষরিক হিসাবে ব্যবহারের অনুমতি দেয়। এগুলির কয়েকটি এএসসিআইআইতে তাদের সংখ্যাসূচক মানগুলি লেখার চেয়ে কম হয়:

  • ¼(2 বাইট) এর চেয়ে কম .25বা 1/4(3 বাইট) is
  • ¾(2 বাইট) এর চেয়ে কম .75বা 3/4(3 বাইট) is
  • (3 বাইট) এর চেয়ে কম 1/16(4 বাইট)।
  • 𐦼(4 বাইট) এর চেয়ে কম 11/12(5 বাইট)।
  • 𒐲(4 বাইট) এর চেয়ে কম 216e3(5 বাইট)।
  • 𒐳(4 বাইট) এর চেয়ে কম 432e3(5 বাইট)।

এর ফলো-আপ হিসাবে আপনি একাধিক ডিজিট এবং / অথবা একটি বিয়োগ করেও ইউনিকোড এক্সটেনশনগুলি ব্যবহার করতে পারেন: say (3² + 4², 2²⁰, 5⁻²)==> (25 1048576 0.04)। আপনি যেমন ইউনিকোডের অপব্যবহার করতে পারেন তার সম্পূর্ণ তালিকাটি এখানে রয়েছে: ডকস.পিয়ারল /.৩/১১৮৫ ভাষা / ইউনিকোড_টেক্সাস
Ramillies

8

ইনপুট পড়ার জন্য ফাংশনগুলি শিখুন। পার্ল 6 এর অনেক আকর্ষণীয় ফাংশন রয়েছে যা সহজেই এআরজিভি, বা এসটিডিআইএন (যদি এআরজিভিতে নির্দিষ্টভাবে নির্দিষ্ট না করা হয়েছিল) থেকে ইনপুটটি পড়তে পারে, যা সঠিকভাবে ব্যবহার করা হলে আপনার কোডটি সংক্ষিপ্ত করতে পারে। আপনি যদি তাদের ফাইলহ্যান্ডল পদ্ধতি হিসাবে কল করেন তবে আপনি তাদের নির্দিষ্ট ফাইলহ্যান্ডলে কাজ করতে বাধ্য করতে পারেন (উদাহরণস্বরূপ আপনি যদি পড়েন তবে আপনাকে এআরজিভিতে STDINআর্গুমেন্ট পড়তে হবে) দরকারী।

get

এই ফাংশনটি একটি একক লাইন পায় এবং এটি স্বয়ংক্রিয়ভাবে চম্প হয়, যাতে আপনার প্রয়োজন হয় না। আপনার যদি কেবল একটি লাইন পড়তে হয় তবে এটি কার্যকর।

lines

এই ফাংশনটি ফাইল বা এসটিডিআইএন থেকে সমস্ত লাইন পায়। এটি একটি অলস তালিকা, সুতরাং আপনি যদি এটির সাথে এটি ব্যবহার করেন তবে forএটি কেবল আপনার যা প্রয়োজন তা পড়বে। উদাহরণ স্বরূপ.

say "<$_>"for lines

slurp

এটি পুরো ফাইলটি বা এসটিডিন পড়বে এবং ফলাফলটি একক স্ট্রিং হিসাবে ফিরিয়ে দেবে।


এই বাগটি ঠিক করা হয়েছিল - কখন, তবে say "<$_>" for linesএখন কাজ করে তা জানেন না
বিড়াল

5

সতর্কতা : পাঠ্যের প্রাচীর কাছে আসছে। এটি সময়ের সাথে আমি জড়ো হওয়া অনেকগুলি ছোট কৌশল।

আপনার সমাধানগুলি বেনামে ব্লক হিসাবে লিখুন

এটি ইতিমধ্যে উল্লেখ করা হয়েছিল তবে আমি এটি পুনরাবৃত্তি করতে চাই। টিআইওতে, আপনি শিরোনামটিতে লিখতে পারেন, কোডটিকে 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যা জংশন অপস দ্বারা খুব সহজেই নকল করা যায় না।


1
আমি মনে করি &&এবং ||এখনও শর্ট সার্কিটের জন্য দরকারী?
ASCII-

@ এএসসিআইআই: হ্যাঁ, অবশ্যই তারা they
রামিলিজ

4

ভেরিয়েবলের জন্য ব্যবহৃত স্থান হ্রাস করুন

এটির কয়েকটি অংশ রয়েছে।

হোয়াইটস্পেস সরান

ব্যবহার করে ঘোষিত ভেরিয়েবলগুলি myসাধারণত স্থান myএবং ভেরিয়েবলের নাম বাদে ঘোষণা করা যেতে পারে । my @aসমতূল্য my@a

সিগিল-কম ভেরিয়েবল ব্যবহার করুন

ভেরিয়েবলের নামের আগে সিগিলটি সরাতে আপনি ব্যাকস্ল্যাশ ব্যবহার করে ভেরিয়েবলগুলি ঘোষণা করতে পারেন:

my \a=1;

(দুর্ভাগ্যক্রমে আপনি স্থানটি সরাতে পারবেন না :()

এটি আপনি দরকারী হিসাবে পরে কেবল খালি পরিবর্তনশীল নাম হিসাবে উল্লেখ করতে পারেন হিসাবে এটি দরকারী।

 a=5;
 a.say

মূলত এটি আপনার কোডে অন্য কোথাও ভেরিয়েবলটি ব্যবহার করলে বাইটস সংরক্ষণ করে। ক্ষতিটি হ'ল পরিবর্তনশীলটি আরম্ভ করা দরকার ised

ব্যবহার $! এবং$/

এই প্রাক-ঘোষিত ভেরিয়েবল সাধারণত যথাক্রমে ব্যতিক্রম এবং Regex মিলের জন্য ব্যবহার করা হয়, কিন্তু ব্যবহার সংজ্ঞায়িত করা প্রয়োজন হবে না my

$!=1;
$/=5;

$/অ্যারে হিসাবে ব্যবহার করা এবং অ্যারের $উপাদানটি অ্যাক্সেস করতে শর্টকাটগুলি অনুসরণ করে একটি নম্বর অনুসরণ করে বিশেষত দরকারী $/;

$/=100..200;
say $5;  #105
say $99; #199

2

ব্যবহার ...পরিবর্তেfirst

সাধারণত, আপনি যদি কোনও শর্তের সাথে মেলে এমন প্রথম সংখ্যাটি খুঁজতে চান তবে আপনি &fএটির মতো প্রতিনিধিত্ব করতে পারেন:

first &f,1..*

তবে পরিবর্তে আপনি ...অপারেটরটি ব্যবহার করতে পারেন :

+(1...&f)

যদি আপনার থেকে শুরু 0করতে হয় তবে আপনি -1পরে পরিবর্তে এটি করতে পারেন +

যদি আপনি @aশর্তযুক্ত তালিকায় প্রথম উপাদানটির সূচক চান তবে &fসাধারণত আপনি এটি করেন:

first &f,@a,:k

পরিবর্তে:

(@a...&f)-1

(বা বিপরীতে আপনি যদি 0 টি সূচক চান)। একইভাবে, আপনি শর্তটি পাস করে প্রথম উপাদান পর্যন্ত সমস্ত উপাদান পেতে পারেন।

এই downsides তালিকা যে হয়েছে কিছু সময়ে শর্ত পাস, অন্যথায় ...অপারেটর তালিকার শেষে বন্ধ দূরদর্শন করতে চেষ্টা করবে, এবং সম্ভবত একটি ত্রুটি নিক্ষেপ করা। আপনি বাম দিকের যে কোনও কোডও ব্যবহার করতে পারবেন না, কারণ এটি ক্রমের অংশ হিসাবে ব্যাখ্যা করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.