উত্তর:
এটি আপনার জানা দরকার সবচেয়ে গুরুত্বপূর্ণ পার্ল গল্ফিং টিপ। আপনি যখনই নিজের কাজটি সম্পাদন করার জন্য একেবারে অক্ষরের কয়েকটি দীর্ঘ ক্রমিকের দিকে নজর রাখছেন, তখন নিজেকে জিজ্ঞাসা করুন কোনও আলাদা বৈশিষ্ট্য ব্যবহার করে একই প্রভাব পাওয়ার অন্য কোনও উপায় নেই কিনা। সাধারণত আছে। এখানে কেবলমাত্র একটি মুষ্টিমেয়:
~~
একটি স্কেলার প্রসঙ্গটি প্রয়োগ করে এবং 4 টির চেয়ে কম খাটো হয় scalar
।
y///c
length
দৈর্ঘ্য প্রাপ্তির চেয়ে কম একটি চর $_
।
চরগুলিতে পুনরাবৃত্তি করা দরকার $_
? split//
সঙ্গে প্রতিস্থাপন /./gs
। (অথবা /./g
করেন তাহলে আপনি নতুন লাইন এড়িয়ে যেতে চাই।) অন্য ভেরিয়েবল সঙ্গে এই কাজগুলো করেনঃ প্রতিস্থাপন split//,$x
সঙ্গে $x=~/./gs
।
প্রতিটি পার্ল অন্তর্নির্মিত কিছু না কিছু দেয়। print
উদাহরণস্বরূপ, সফল I / O নির্দেশ করতে 1 প্রদান করে। আপনার যদি $_
সত্যিকারের মান শুরু করতে হয়, উদাহরণস্বরূপ, $_=print$foo
আপনি একটি পাথর দিয়ে দুটি পাখি মারতে পারবেন।
পার্লের প্রায় প্রতিটি বিবৃতি একটি বহিরাগত প্রসঙ্গে ব্যবহারের মঞ্জুরি দিয়ে একটি অভিব্যক্তি হিসাবে লেখা যেতে পারে। একাধিক বিবৃতি কমা দিয়ে এক সাথে বেঁধে একাধিক প্রকাশ হতে পারে can টেস্ট শর্ট-সার্কিট অপারেটার সঙ্গে সম্পন্ন করা যেতে পারে ?:
&&
||
সঙ্গে, এবং এছাড়াও and
এবং or
, যা একই জিনিস করে কিন্তু প্রাধান্য দিয়ে (নিয়োগ সহ) অন্য সব অপারেটরদের কম। Loops মাধ্যমে করা যাবে map
বা grep
। এমনকি কীওয়ার্ডগুলি পছন্দ করে next
, last
এবং return
ফিরে না আসা সত্ত্বেও একটি অভিব্যক্তি প্রসঙ্গে ব্যবহার করা যেতে পারে! এই ধরণের রূপান্তরগুলি মাথায় রেখে আপনি কোডের ব্লকগুলিকে এক্সপ্রেশন দিয়ে প্রতিস্থাপনের সুযোগ দেয় যা বিভিন্ন প্রসঙ্গে প্রাসঙ্গিক হতে পারে।
$foo
। অন্যথায়, এর $_=1
চেয়ে অনেক কম $_=print""
এবং একই প্রভাব রয়েছে।
$x
? অন্যথায় আপনি কেবল /./gs
এবং করতে পারে /./g
।
পার্ল এর বিশেষ ভেরিয়েবল আপত্তি!
পূর্ববর্তী উত্তর যেমন লক্ষ করেছি $/
এবং $"
ডিফল্ট দ্বারা সক্রিয়া করা হয় "\n"
এবং " "
যথাক্রমে।
$,
এবং $\
উভয়ই undef
ডিফল্ট হিসাবে সেট করা হয় এবং 3 টি অক্ষর সংক্ষিপ্ত হয়।
$\
একটি মান সেট করা এটি প্রত্যেকের সাথে সংযুক্ত হয়ে যায় print
। উদাহরণস্বরূপ: perl -ple '$\="=".hex.$/'
হ্যান্ডি হেক্স থেকে দশমিক রূপান্তরকারী।
আপনি যদি কমান্ড-লাইন থেকে ফাইলগুলি পড়ছেন না, আপনি -i
স্ট্রিংকে ইনপুট দেওয়ার জন্য অতিরিক্ত চ্যানেল হিসাবে কমান্ড-লাইন সুইচটি ব্যবহার করতে পারেন । এর মান সংরক্ষণ করা হবে $^I
।
$=
এতে যা কিছু নির্ধারিত হয়েছে তাকে পূর্ণসংখ্যা হিসাবে বাধ্য করে। দৌড়তে perl -ple '$_=$==$_'
এবং এটিকে বিভিন্ন ইনপুট দেওয়ার চেষ্টা করুন । তেমনি, $-
এর মানটিকে একটি অ-নেতিবাচক পূর্ণসংখ্যা হিসাবে বাধ্য করে (যেমন একটি শীর্ষস্থানীয় ড্যাশকে একটি অ-সংখ্যাযুক্ত চরিত্র হিসাবে বিবেচনা করা হয়)।
আপনি $.
একটি বুলিয়ান পতাকা হিসাবে ব্যবহার করতে পারেন যা while(<>)
লুপের প্রতিটি পুনরাবৃত্তিতে স্বয়ংক্রিয়ভাবে সত্য (ননজারো) মানটিতে পুনরায় সেট হয়ে যায় ।
-n
এবং তুলনামূলক কোঁকড়া বন্ধনীএটি সর্বজনবিদিত যে কমান্ড লাইন সুইচটি -n
প্রতিটি লাইনের জন্য একবার স্ক্রিপ্টটি কার্যকর করতে ব্যবহার করা যেতে পারে।
perl --help
বলেছেন:
-n assume "while (<>) { ... }" loop around program
এটি যা স্পষ্টভাবে বলে না তা হ'ল পার্ল প্রোগ্রামের চারপাশে কেবল একটি লুপ ধরে না; এটি আক্ষরিকভাবে এটি while (<>) { ... }
প্রায় আবৃত ।
এইভাবে, নিম্নলিখিত কমান্ডগুলি একে অপরের সমতুল্য:
perl -e 'while(<>){code}morecode'
perl -ne 'code;END{morecode}'
perl -ne 'code}{morecode'
-p
এবং তুলনামূলক কোঁকড়া বন্ধনীএকইভাবে উপরের দিকে, -p
স্যুইচটি while (<>) { ... ; print }
প্রোগ্রামের চারপাশে মোড়ানো ।
তুলনামূলকভাবে কোঁকড়া বন্ধনী ব্যবহার করে, perl -p 'code}{morecode'
কেবলমাত্র code
সমস্ত ইনপুট লাইন ব্যবহারের পরে একবার মুদ্রণ করা হবে , তারপরে morecode
।
যেহেতু $_
যখন undefined হয় morecode;print
মৃত্যুদন্ড কার্যকর করা হয়, আউটপুট রেকর্ড বিভাজক $\
প্রকৃত আউটপুট প্রিন্ট করতে নির্যাতিত করা যেতে পারে।
উদাহরণ স্বরূপ
perl -pe '$\+=$_}{'
STDIN থেকে প্রতি লাইনে একটি নম্বর পড়ে এবং তাদের যোগফল মুদ্রণ করে।
#!perl -n
প্রথম লাইনে এটি অর্জন করতে পারবেন , তাই না?
-p
এবং $\
) এর সংমিশ্রণটি দেখেছি । তার উত্তরগুলি পড়ার জন্য এটি একটি ভাল পার্ল টিপ।
}for(...){
ধনুর্বন্ধনীগুলির মধ্যে একটি নিক্ষেপ করা প্রায়শই বেশ সহজেই কার্যকর হয়, যেমন কোডগলফ.স্ট্যাকেক্সেঞ্জিং.com
$_
স্কেলার রেফারেন্সগুলি অপসারণ করতে ব্যবহার করুন । এটি বিশেষ ভেরিয়েবল যা বেশিরভাগ ফাংশন দ্বারা একটি ডিফল্ট হিসাবে ব্যবহৃত হয়, এবং কেবলমাত্র পরামিতিগুলি রেখে যাওয়া এই ভেরিয়েবলটি উল্লেখ করার জন্য একটি শর্টকাট।
পরিবর্তন করে $n
থেকে $_
, আপনি পরিবর্তন করতে পারেন $n=<>;chop$n;print$n
থেকে$_=<>;chop;print
এখানে, print
ফাংশনটি $_
ডিফল্টরূপে সামগ্রীগুলি মুদ্রণ করে chop
এবং কাজ করে $_
।
$_=<>;
প্রয়োজন, না <>;
মধ্যে লাইন পড়া $_
স্বয়ংক্রিয়ভাবে?
$_=<>;print
এবং তুলনা <>;print
। প্রথমটি আমার কাছে পুনরাবৃত্তি করে আমি কী টাইপ করি, অন্যটি না করে।
print while(<>)
। নিশ্চিত না যে এটি কোনও বিশেষ ক্ষেত্রে বা এর পিছনে কিছু সুসংগত যুক্তি রয়েছে, না এই <>
অংশটির অংশ perlop
বা while
অংশের অংশই perlsyn
এই আচরণের উল্লেখ করেছে বলে মনে হয় না।
while(<>)
একটি বিশেষ কেস, যা পেরসিনে নথিভুক্ত, I / O অপারেটর: 'এবং যদি কেবলমাত্র ইনপুট প্রতীকটি "যখন" বিবৃতিটির শর্তাধীন থাকে (এমনকি "(;;)" এর জন্য ছদ্মবেশী হলেও) লুপ), মানটি স্বয়ংক্রিয়ভাবে গ্লোবাল ভেরিয়েবল assigned _ এ নির্ধারিত হয়, যা আগে যা ছিল তা ধ্বংস করে দেয় ""
পার্লের বিশেষ ভেরিয়েবলগুলি যেখানে আপনি পারেন যেখানে ব্যবহার করুন, যেমন:
$"
পরিবর্তে ব্যবহার করুন" "
$/
পরিবর্তে ব্যবহার করুন"\n"
লেসারের সাহায্যে তাদের গ্যারান্টিযুক্ত এক-চরিত্রের দীর্ঘ শনাক্তকারী হওয়ার অতিরিক্ত সুবিধা রয়েছে। এটি নিম্নলিখিত কীওয়ার্ডটিতে এটি আঠালো করা সম্ভব করে:print$.for@_
সমস্ত বিশেষ ভেরিয়েবলের তালিকা এখানে পাওয়া যায়: বিশেষ চলক
ব্যবহার করবেন না qw
। এটি এমন দুটি চরিত্রের অপচয় যা আরও ভাল উপায়ে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত লিখবেন না।
@i=qw(unique value);
পরিবর্তে খালি শব্দ ব্যবহার করুন।
@i=(unique,value);
অথবা যদি আপনি খালি শব্দ ব্যবহার করতে না পারেন তবে glob
বাক্য গঠন ব্যবহার করুন ।
@i=<unique value>;
glob
সিনট্যাক্সটি আকর্ষণীয় প্রভাবের জন্যও ব্যবহার করা যেতে পারে।
@i=<item{1,2,3}>;
যৌগিক স্টেটমেন্টের পরিবর্তে স্টেটমেন্ট মডিফায়ার ব্যবহার করুন।
যৌগিক বিবৃতিগুলির জন্য ব্লকের জন্য আর্গুমেন্ট এবং ধনুর্বন্ধনীগুলির জন্য প্রথম বন্ধনীর প্রয়োজন হয়, যদিও বিবৃতি সংশোধনকারীগুলির প্রয়োজন হয় না।
তুলনা করা:
$a++,$b++while$n--
বনাম while($n--){$a++;$b++}
chop$,if$c
বনাম if($c){chop$,}
নোট করুন যে শেষ উদাহরণটি এর সাথে সম্পর্কযুক্ত $c&&chop$,
তবে বেশিরভাগ বহু-বিবৃতি ক্রিয়াকলাপের জন্য সত্যই জ্বলজ্বল শুরু করে। মূলত যে কোনও কিছুই অপারেটরের নজরে হারায় &&
।
না use strict
। (আমাকে পিসি.ই.এস.সি. প্রসঙ্গটি সম্পর্কে এটাকে উদ্ধৃত করবেন না) এবং আরও গুরুত্বপূর্ণ বিষয়, কোডটি এমনভাবে ব্যবহার করবেন না যাতে কঠোরতার অধীনে রয়েছে। স্বাভাবিক সন্দেহভাজন:
my
যদি আপনি এড়াতে পারেন তবে ভেরিয়েবলগুলি ডিক্লেয়ার করবেন না । সত্যিকারের কেবলমাত্র পরিবর্তনশীলগুলি my
হ'ল আপনি লাক্ষিকভাবে বাদ দিতে চান। গল্ফ করার সময় এগুলির মধ্যে সবেই কোনও, যেখানে আপনার স্কোপ সুরক্ষার প্রয়োজন নেই এবং পুনরাবৃত্তি সম্পূর্ণরূপে নিয়ন্ত্রণ করার ঝোঁক রয়েছে।print hello
কাজ করবে না এটির অর্থ আসলে print hello $_
( $_
ফাইলের কাছে মুদ্রণ hello
)।
print
, এবং এখন আমি একটি সুন্দর এবং সংক্ষিপ্ত উদাহরণ খুঁজে পাচ্ছি না)
আমি নিশ্চিত যে এর কয়েকটিটির আনুষ্ঠানিক নাম রয়েছে এবং আমি সেগুলি সম্পর্কে ঠিক জানি না।
print $n++ while ($n < 10)
$var = join('',<>)
print ('X'*10) . "\n";
চেয়ে লম্বাprint ('X'*10) . $/;
say
ফাংশনটি তার চেয়ে কম print
, তবে আপনাকে কোডটি এর -E
পরিবর্তে চালাতে হবে-e
a..z
বা এমনকি সীমা ব্যবহার করুন aa..zz
। যদি স্ট্রিং হিসাবে প্রয়োজন হয়, ব্যবহার করুন join
।$z = 'z'; print ++$z;
হবেaa
এই মুহূর্তে আমি এখনই ভাবতে পারি। আমি পরে আরও কিছু যোগ করতে পারেন।
print ('X'*10) . $/;
করার কথা? আমার জন্য এটি প্রিন্ট করে 0
এবং কোনও নতুন লাইন নেই। একটি জিনিসের জন্য, প্রথম বন্ধনীগুলি একটি ফাংশন-স্টাইল কল আর্গুমেন্টে পরিণত হয় print
, যা এর চেয়ে আরও শক্ত করে .
। এবং আপনি এর x
পরিবর্তে *
বা কিছু বোঝাতে চেয়েছিলেন ?
while
, join'',<>;
সেগুলি ছাড়াও কাজ করে না।
ব্যবহার $%
পরিবর্তে $a
আপনি সঠিক একটি পাশে পরিবর্তনশীল নাম লিখুন করার অনুমতি দিতে পারেন if
, for
বা while
হিসেবে গঠন করা:
@r=(1,2,3,4,5);$%=4;
print$_*$%for@r
অনেকগুলি ব্যবহার করা যেতে পারে তবে ডক্স এবং @ ব্রেডবক্সের উত্তর যাচাই করে যার জন্য যাদু প্রভাব রয়েছে!
আপনি যদি @ জেবির উত্তর অনুসারে স্টেটমেন্ট মোডফায়ার ব্যবহার করতে না পারেন , মানচিত্রটি একটি বাইট সংরক্ষণ করতে পারে:
for(@c){}
বনাম map{}@c;
আপনি যদি নেস্টেড পুনরাবৃত্তিগুলি করতে চান তবে আপনি দরকারী যখন আপনি পোস্টফিক্স for
লুপগুলি ভিতরে রাখতে পারেন map
।
পার্লের 'ম্যাচের আগে পাঠ্য' এবং 'ম্যাচের পরে পাঠ্য' এর জন্য যাদু ভেরিয়েবল রয়েছে যাতে সম্ভাব্য কম অক্ষরের সাথে দুটি গ্রুপে বিভক্ত হওয়া সম্ভব:
($x,$y)=split/,/,$_;
($x,$y)=/(.+),(.+)/;
/,/; # $x=$`, $y=$'
# Note: you will need to save the variables if you'll be using more regex matches!
এটি এর প্রতিস্থাপনের পাশাপাশি ভাল কাজ করতে পারে substr
:
$s=substr$_,1;
/./;# $s=$'
$s=substr$_,4;
/.{4}/;# $s=$'
আপনার যদি ম্যাচের বিষয়বস্তুগুলির প্রয়োজন হয় $&
তবে ব্যবহার করা যেতে পারে যেমন:
# assume input like '10 PRINT "Hello, World!"'
($n,$c,$x)=split/ /,$_;
/ .+ /; # $n=$`, $c=$&, $x=$'
যদি আপনি আপনার কোডটিতে print
চার বা ততোধিক বার কল করেন (এটি স্পষ্টভাবে আপনি যে রুটিনটি কল করছেন তার দৈর্ঘ্যের সাথে পরিবর্তিত হয়), এটি একটি সংক্ষিপ্ত উপ নাম দিয়ে প্রতিস্থাপন করুন:
sub p{print@_}p;p;p;p
বনাম
print;print;print;print
আপনার মতো কোড থাকলে:
$i--if$i>0
তুমি ব্যবহার করতে পার:
$i-=$i>0
পরিবর্তে কিছু বাইট সংরক্ষণ করুন।
আপনি যদি কোনও ভেরিয়েবলকে বরাদ্দ না করে থাকেন এবং তাই ব্রেডবক্সের টিপ ব্যবহার করতে না পারেন , আপনি এই অভিব্যক্তিটি ব্যবহার করতে পারেন 0|
:
rand 25 # random float eg. 19.3560355885212
int rand 25 # random int
0|rand 25 # random int
rand 25|0 # random int
~~rand 25 # random int
অ্যারে সূচকটি অ্যাক্সেস করার জন্য আপনাকে কোনও পূর্ণসংখ্যার ব্যবহার করার প্রয়োজন নেই তার চেয়ে এটি লক্ষণীয়:
@letters = A..Z;
$letters[rand 26]; # random letter
redo
ছাড়া for
বা একটি ব্লকে লুপ আচরণ যুক্ত করে while
। {redo}
একটি অসীম লুপ।
ফাংশন কলগুলি প্রথম বন্ধনীরূপে রাখবেন না।
পার্ল আপনাকে NAME LIST
সিনট্যাক্স ব্যবহার করে একটি পরিচিত (কোর বা পূর্বনির্ধারিত) ফাংশনটিতে কল করতে দেয় । এটি আপনাকে &
সিগিলটি (যদি আপনি এখনও এটি ব্যবহার করে থাকেন) পাশাপাশি প্যারেন্টেসিসগুলি ড্রপ করতে দেয় ।
উদাহরণ স্বরূপ: $v=join'',<>
একটি অ্যাসাইনমেন্ট এক্সপ্রেশন এর মান ব্যবহার করার চেষ্টা করুন, যেমন:
# 14 characters
$n=pop;$o=$n&1
# 13 characters, saves 1
$o=($n=pop)&1
$n
পার্লের 2 টি অক্ষর হওয়ায় এটি কাজ করে । আপনি বিনা ব্যয়ে পরিবর্তিত হতে পারেন , এবং 1 টি অর্ধিকালনকে কার্য বন্ধনে স্থানান্তরিত করে সংরক্ষণ $n
করতে পারেন ()
।
নেস্টেড টের্নারি লজিকের মধ্যে আপনি একাধিক বিভিন্ন বিবৃতি চালাতে পারেন।
ধরুন আপনি একটি বড় আছে if
- elsif
বিবৃতি। এটি কোনও যুক্তি এবং কোনও বিবৃতি হতে পারে।
if( $_ < 1 ) {
$a=1;
$b=2;
$c=3;
say $a.$b.$c;
} elsif($_ < 2 ) {
$a=3;
$b=2;
$c=1;
say $a.$b.$c;
} elsif( $_ < 3) {
$a=2;
$b=2;
$c=2;
say $a.$b.$c;
}
আপনি (cmd1, cmd2, cmd3)
সমস্ত কমান্ড চালাতে টের্নারি অপারেটরের অভ্যন্তরে ব্যবহার করতে পারেন ।
$_ < 1 ?
($a=1,$b=2,$c=3,say$a.$b.$c):
$_ < 2 ?
($a=3,$b=2,$c=1,say$a.$b.$c):
$_ < 3 ?
($a=2,$b=2,$c=2,say$a.$b.$c):
0; #put the else here if we have one
এখানে একটি জঘন্য উদাহরণ:
perl -nE'$_<1?($a=1,$b=2,$c=3,say$a.$b.$c):$_<2?($a=3,$b=2,$c=1,say$a.$b.$c):$_<3?($a=2,$b=2,$c=2,say$a.$b.$c):0;' <(echo 2)
select(undef,undef,undef,$timeout)
পরিবর্তে ব্যবহার করুনTime::HiRes
( Https://stackoverflow.com/a/896928/4739548 থেকে নেওয়া )
অনেক চ্যালেঞ্জগুলির জন্য আপনাকে পূর্ণসংখ্যার চেয়ে বৃহত্তর নির্ভুলতার সাথে ঘুমানো দরকার। select()
এর সময়সীমা যুক্তি কেবল এটি করতে পারে।
select($u,$u,$u,0.1)
এর চেয়ে অনেক বেশি দক্ষ:
import Time::HiRes qw(sleep);sleep(0.1)
সাবেক মাত্র 20 বাইট আধুনিক 39. লাগে যেহেতু যাইহোক, সাবেক প্রয়োজন আপনি ব্যবহার করছেন না হয়, $u
এবং এটি সংজ্ঞায়িত হয়নি।
আপনি যদি এটি ব্যবহার করতে যাচ্ছেন তবে অনেক আমদানি Time::HiRes
শোধ করে, তবে আপনার যদি কেবল একবার প্রয়োজন হয়, select($u,$u,$u,0.1)
19 বাইট সংরক্ষণ করে এটি বেশিরভাগ ক্ষেত্রে অবশ্যই উন্নতি।
চ্যালেঞ্জ অন্যথায় সুনির্দিষ্ট না করে, আপনার নতুন লাইনের পেছনের দরকার হবে না।
আমাদের 'চ্যালেঞ্জ' বলছে '0 থেকে 9 থেকে এসটিডিওউটে একটি এলোমেলো সংখ্যা আউটপুট'। আমরা এই কোডটি নিতে পারি (২৮ বাইট):
$s=int(rand(10));print"$s\n"
এবং এটি এটিকে ছোট করুন (25 বাইট):
$s=int(rand(10));print $s
কেবল ভেরিয়েবল মুদ্রণ দ্বারা। এই শেষটি কেবলমাত্র এই চ্যালেঞ্জটির জন্য বিশেষভাবে প্রয়োগ করা হয় (19 বাইট):
print int(rand(10))
কিন্তু এটি কেবল তখনই কাজ করে যখন আপনাকে অ্যাসাইনমেন্ট এবং প্রিন্টিংয়ের মধ্যে চলকটিতে কিছু করতে হবে না।
মাঝেমধ্যে (প্রায়শই কুইন বা সীমাবদ্ধ-উত্স চ্যালেঞ্জগুলি মোকাবেলা করার সময়) বাসা বাঁধার আক্ষরিক ক্ষমতা থেকে আপনি প্রচুর উপকৃত হন। সাধারণত, আপনি এটি দিয়ে এটি করতে চাই q(…)
। তবে স্ট্রিংয়ের ভিতরে আপনার কী অক্ষরের প্রয়োজন তা নির্ভর করে আপনি <…>
গ্লোব অপারেটরটি বাইট এবং ব্যবহার করতে সক্ষম হতে পারেন save (নোট করুন যে কোণ বন্ধনীগুলির ভিতরে থাকা কোনও ফাইল হ্যান্ডেলের মতো দেখতে পারে না এবং এটি ফাইলনামের তালিকায় প্রসারিত হওয়া বোঝায় না, যার অর্থ বেশ কয়েকটি অক্ষর সঠিকভাবে কাজ করবে না))
এর সূক্ষ্ম চিত্রণটি নিম্নলিখিত কোডটি সাইন ওয়েভের ইনপুটকে আকার দিচ্ছে:
s/./print" "x(sin($i+=.5)*5+5).$&/eg;
আপনি দেখতে পাচ্ছেন যে এটি স্ট্যান্ডার্ড ইনপুটটিতে অক্ষরগুলির দ্বারা পুনরাবৃত্তি করার বেশ কমপ্যাক্ট উপায়। জিনিসগুলি কীভাবে মিলে যায় তা পরিবর্তন করতে আপনি অন্যান্য রেজেক্স ব্যবহার করতে পারেন।
$_=print""
তুলনায় খাটো$_=print$foo
।