পারেলের লুকানো বৈশিষ্ট্য?


143

পার্লের এমন কিছু সত্যিই দরকারী তবে রহস্যজনক ভাষার বৈশিষ্ট্যগুলি কী কী যা আপনি আসলে কার্যকর কাজে কাজ করতে সক্ষম হয়েছেন?

নির্দেশিকা:

  • পার্ল কোর এবং সিপিএএন নয় উত্তর সীমাবদ্ধ করার চেষ্টা করুন
  • দয়া করে একটি উদাহরণ এবং একটি সংক্ষিপ্ত বিবরণ দিন

লুকানো বৈশিষ্ট্যগুলি অন্যান্য ভাষার লুকানো বৈশিষ্ট্যগুলিতেও পাওয়া যায়:

(এগুলি সবই কোরিওনের উত্তর থেকে এসেছে )

  • সি
    • ডাফের ডিভাইস
    • বহনযোগ্যতা এবং মানকতা
  • সি শার্প
    • সাদা স্থানের সীমিত তালিকা এবং স্ট্রিংয়ের জন্য উদ্ধৃতি
    • নামকরণের স্থান
  • জাভা
    • স্ট্যাটিক ইনিটালাইজারস
  • জাভাস্ক্রিপ্ট
    • কাজগুলি প্রথম শ্রেণির নাগরিক
    • অবরুদ্ধ সুযোগ এবং বন্ধ
    • কোনও ভেরিয়েবলের মাধ্যমে অপ্রত্যক্ষভাবে পদ্ধতি এবং অ্যাক্সেসরদের কল করা
  • চুনি
    • কোডের মাধ্যমে পদ্ধতি নির্ধারণ করা
  • পিএইচপি
    • বিস্তৃত অনলাইন ডকুমেন্টেশন
    • যাদু পদ্ধতি
    • প্রতীকী রেফারেন্স
  • পাইথন
    • এক লাইনের মান অদলবদল
    • এমনকি আপনার নিজের কার্যকারিতা সহ কোর ফাংশনগুলি প্রতিস্থাপনের ক্ষমতা

অন্যান্য লুকানো বৈশিষ্ট্য:

অপারেটর:

উদ্ধৃতি নির্মাণসমূহ:

সিনট্যাক্স এবং নাম:

মডিউল, প্রাগমাস এবং কমান্ড-লাইন বিকল্পগুলি:

ভেরিয়েবল:

লুপস এবং প্রবাহ নিয়ন্ত্রণ:

নিয়মিত অভিব্যক্তি:

অন্যান্য বৈশিষ্ট্য:

অন্যান্য কৌশল এবং মেটা-উত্তর:


আরো দেখুন:


এগুলির বেশিরভাগ বৈশিষ্ট্য প্রতিদিনের ব্যবহারে হয়, কিছু পার্ল স্ক্রিপ্টের বেশিরভাগ ক্ষেত্রে দেখা যায় এবং বেশিরভাগ "অন্যান্য" এর অধীনে অন্য ভাষা থেকে অন্তর্ভুক্ত থাকে, এইগুলিকে "লুকানো" বলে প্রশ্নটির উদ্দেশ্য বদলে দেয় changes
রিইনারপোস্ট

উত্তর:


54

ফ্ল্যাগ-ভেরিয়েবল ব্যবহার না করে কোনও ফাইল হ্যান্ডেল দিয়ে রেকর্ডগুলি (সাধারণত লাইনগুলি) ফেরত পাঠানো হলে প্রথম পুনরাবৃত্তিটি এড়িয়ে যাওয়ার জন্য ফ্লিপ-ফ্লপ অপারেটর কার্যকর:

while(<$fh>)
{
  next if 1..1; # skip first record
  ...
}

perldoc perlopআরও তথ্য এবং উদাহরণের জন্য "ফ্লিপ-ফ্লপ" চালান এবং অনুসন্ধান করুন।


আসলে এটি আওক থেকে নেওয়া হয়েছে, যেখানে আপনি প্যাটার্ন 1, প্যাটার্ন 2 লিখে দুটি প্যাটার্নের মধ্যে ফ্লিপ-ফ্লপ করতে পারেন
ব্রুনো ডি

15
পরিষ্কার করার জন্য, এর "লুকানো" দিকটি হ'ল উভয়ই স্কেলারের সাথে যুক্ত হলে '..' একটি ধ্রুবক হয় তবে ইনপুট লাইন নম্বর ($।) এর সাথে তুলনা করে মানটি
মাইকেল কারম্যান

47

পার্লে অনেকগুলি অ-সুস্পষ্ট বৈশিষ্ট্য রয়েছে।

উদাহরণস্বরূপ, আপনি কি জানতেন যে সিগিলের পরে কোনও স্থান থাকতে পারে?

 $ perl -wle 'my $x = 3; print $ x'
 3

অথবা আপনি যদি প্রতীকী রেফারেন্স ব্যবহার করেন তবে আপনি সংখ্যার নাম দিতে পারবেন?

$ perl -lwe '*4 = sub { print "yes" }; 4->()' 
yes

"বুল" কোরিয়া অপারেটরটিও রয়েছে, যা সত্য প্রকাশের জন্য 1 এবং মিথ্যাটির জন্য খালি স্ট্রিং দেয়:

$ perl -wle 'print !!4'
1
$ perl -wle 'print !!"0 but true"'
1
$ perl -wle 'print !!0'
(empty line)

অন্যান্য আকর্ষণীয় জিনিস: আপনার সাথে use overloadস্ট্রিং লিটারেলগুলি এবং সংখ্যাগুলি ওভারলোড করতে পারে (এবং উদাহরণস্বরূপ এগুলিকে বিগআইন্টস বা যাই হোক না কেন)।

এই জিনিসগুলির অনেকগুলি আসলে কোথাও নথিভুক্ত করা হয়, বা নথিভুক্ত বৈশিষ্ট্যগুলি থেকে যৌক্তিকভাবে অনুসরণ করা হয়, তবে তবুও কিছু খুব বেশি পরিচিত নয়।

আপডেট : আরেকটি সুন্দর। q{...}উদ্ধৃতি নির্মাণের নীচে উল্লেখ করা হয়েছিল, তবে আপনি কি জানেন যে আপনি চিঠিপত্রগুলি সীমানা হিসাবে ব্যবহার করতে পারেন?

$ perl -Mstrict  -wle 'print q bJet another perl hacker.b'
Jet another perl hacker.

একইভাবে আপনি নিয়মিত প্রকাশ করতে পারেন:

m xabcx
# same as m/abc/

2
"আপনি কি জানতেন যে সিগিলের পরে কোনও জায়গা থাকতে পারে?" আমি পুরোপুরি flabbergasted। কি দারুন.
অ্যারিস্টটল প্যাগাল্টজিস

1
শান্ত! !! $ undef_var কোনও সতর্কতা তৈরি করে না।
এক্সিম্যান

4
আমি মনে করি আপনার অক্ষরের অক্ষরে অক্ষরে অক্ষরে অক্ষরে ব্যবহারের উদাহরণটি "জেট অন্য পার্ল হ্যাকার" এর পরিবর্তে " কেবল অন্য পার্ল হ্যাকার" হওয়া উচিত = পি
ক্রিস লুটজ

সবচেয়ে খারাপ দিকটি হ'ল আপনি অন্যান্য জিনিসগুলিও সীমানা হিসাবে ব্যবহার করতে পারেন। এমনকি বন্ধনী বন্ধ। নিম্নলিখিতগুলি বৈধ: s} regex} প্রতিস্থাপন} xsmg; q] স্ট্রিং আক্ষরিক];
রায়ান সি থম্পসন

46

জাদুযুক্ত এআরজিভি এর মাধ্যমে সংকুচিত ফাইলগুলির জন্য সমর্থন যুক্ত করুন :

s{ 
    ^            # make sure to get whole filename
    ( 
      [^'] +     # at least one non-quote
      \.         # extension dot
      (?:        # now either suffix
          gz
        | Z 
       )
    )
    \z           # through the end
}{gzcat '$1' |}xs for @ARGV;

(শেল মেটাচার্যাক্টরের সাথে ফাইলের নামগুলি হ্যান্ডেল করার জন্য $ _ চারপাশে উদ্ধৃতিগুলি প্রয়োজনীয়)

এখন <>বৈশিষ্ট্যটি @ARGV".gz" বা ".Z" দিয়ে শেষ হওয়া কোনও ফাইলকে সংক্ষেপণ করবে:

while (<>) {
    print;
}

2
আমি মনে করি না |প্রতিস্থাপনে আপনাকে পালাতে হবে ।
ক্রিস লুৎজ

আমি এটি দেখছি এবং আমি কীভাবে এটি কাজ করে তা বুঝতে পারি না। কোন বিন্দু zcat |দিয়ে পাইপের নির্দেশ হিসাবে পার্স করা হয়?
ইথার

1
@ ইথার => পাইপ সনাক্তকরণ দুটি খোলা যুক্তিগুলির একটি বৈশিষ্ট্য, যা হীরা অপারেটর এটি প্রতিটি ফাইল খোলার সময় ব্যবহার করে@ARGV
এরিক স্ট্রোম

40

পার্লের আমার প্রিয় বৈশিষ্ট্যগুলির ||মধ্যে একটি বুলিয়ান অপারেটরটি পছন্দগুলির একটি সেটের মধ্যে নির্বাচন করতে ব্যবহার করছে ।

 $x = $a || $b;

 # $x = $a, if $a is true.
 # $x = $b, otherwise

এর অর্থ এটি যে কেউ লিখতে পারেন:

 $x = $a || $b || $c || 0;

থেকে প্রথম সত্য মান নিতে $a, $bএবং $c, বা একটি ডিফল্ট 0অন্যথায়।

পার্ল ৫.১০-তে //অপারেটরও রয়েছে, যা বাম দিকের সংজ্ঞা দেওয়া থাকলে এবং ডানদিকে অন্যথায় ফিরিয়ে দেয়। নিম্নলিখিত নির্বাচন প্রথম সংজ্ঞায়িত মান থেকে $a, $b, $c, অথবা 0অন্যথায়:

$ x = $ এ // $ বি // $ সি // 0;

এগুলি তাদের সংক্ষিপ্ত হাতের ফর্মগুলির সাথেও ব্যবহার করা যেতে পারে যা ডিফল্ট সরবরাহের জন্য খুব দরকারী:

$ x || = 0; # যদি $ x ভুল হয় তবে এর মান 0 হয় has

; x // = 0; # যদি $ x অপরিবর্তিত থাকে তবে এর মান এখন শূন্য।

চীয়ারীত্ত,

পল


4
এটি এমন একটি সাধারণ প্রথা যা এটি "লুকানো" বৈশিষ্ট্য হিসাবে খুব কমই যোগ্য করে তোলে।
মাইকেল কারম্যান 13

3
চমত্কার মুদ্রকটি মনে করে লজ্জাজনক // এটি একটি মন্তব্য :)
জন ফার্গুসন

2
প্রশ্ন, এই নতুন অপারেটরগুলি ব্যবহার করার জন্য কোনও "ব্যবহার বৈশিষ্ট্য" রয়েছে, বা সেগুলি ডিফল্ট সক্ষম রয়েছে? আমি এখনও পার্ল 5.10 এর বৈশিষ্ট্যগুলি ঝুঁকছি।
জেজে

6
// ডিফল্টভাবে সেখানে আছে, কোনও বিশেষ টুইটের প্রয়োজন নেই। আপনি এটি ডোর-প্যাচ দিয়ে 5.8.x এ ব্যাকপোর্ট করতে পারেন ... যে কোনও সিপিএন আয়নায় লেখক / আইডি / এইচ / এইচএম / এইচএমবিআরএনডি / ডিরেক্টরি দেখুন। ফ্রিবিএসডি 6.x এবং এর বাইরে তাদের পার্ল প্যাকেজে আপনার জন্য এটি করে।
dland

2
যখন || বা // do {with এর সাথে একত্রিত হয়েছে, আপনি আরও জটিল কার্যনির্বাহী করতে পারবেন, যেমন $ x = $ a || {আমার $ z করুন; 3 বা 4 লাইন উদ্দীপনা; $ z};
RET

39

অপারেটরগুলি ++ এবং অচেনা - কেবল সংখ্যাগুলিতে নয়, স্ট্রিংগুলিতেও কাজ করে।

my $_ = "a"
print -$_

প্রিন্ট -এ

print ++$_

প্রিন্ট

$_ = 'z'
print ++$_

প্রিন্ট


3
পার্লভারের উদ্ধৃতি দিতে: "স্বতঃ-হ্রাস অপারেটর যাদু নয় is" সুতরাং --স্ট্রিং উপর কাজ করে না।
মরিৎজ

"এএ" "জেড" অনুসরণ করে এমন প্রাকৃতিক উপাদান বলে মনে হয় না। আমি পরের সর্বোচ্চ আসকি মানটি আশা করব যা "{"।
ইথার

4
কোনও প্রোগ্রামারকে জিজ্ঞাসা করবেন না যে "z" এর পরে কী আসে; একটি মানুষ জিজ্ঞাসা করুন। একটি দীর্ঘ তালিকায় আইটেম সংখ্যা করার জন্য এই বৈশিষ্ট্যটি দুর্দান্ত।
ব্যারি ব্রাউন

17
পার্লে নতুন যখন আমি এ বৈশিষ্ট্যটি যথাযথ z এর সাথে আচরণের সাথে বাস্তবায়িত করেছিলাম তখন এটি সহকর্মীর কাছে দেখিয়েছিল যে আমাকে এবং আমাকে হেসেছিল এবং বলেছিল "আমাকে আপনাকে কিছু দেখাতে দাও"। আমি কিছুটা কেঁদেছি কিন্তু কিছু শিখেছি।
কোপাস

2
@ ইথার - আপনি যদি এটি চান তবে সংখ্যাগুলি ব্যবহার করুন এবং এএসসিআইআই-এর সাথে এটিকে স্বতঃবর্তিত করুন ord()। অথবা, একটি ছোট ক্লাস লিখুন এবং এটি আপনার জন্য অপারেটরদের ওভারলোড করুন।
ক্রিস লুৎজ

36

যেহেতু পার্লের অন্যান্য তালিকা থেকে প্রায় সমস্ত "রহস্যজনক" অংশ রয়েছে, আমি আপনাকে একটি জিনিস যা পার্ল পারছে না তা বলব:

পার্ল এক জিনিস যা করতে পারে না তা হ'ল আপনার কোডগুলিতে খালি ইআরআরএল রয়েছে, কারণ //অপারেটরটি নিয়মিত প্রকাশের জন্য ব্যবহৃত হয়।

পার্ল কী অফার করে তা কেবল আপনার কাছে স্পষ্ট ছিল না, এখানে সম্ভবত পুরোপুরি সুস্পষ্ট নয় এমন এন্ট্রিগুলির একটি নির্বাচনী তালিকা রয়েছে:

ডাফের ডিভাইস - পার্লে

বহনযোগ্যতা এবং স্ট্যান্ডার্ডনেস - পার কম কম্পিউটার সংকলকটির চেয়ে বেশি কম্পিউটার সম্ভবত রয়েছে computers

একটি ফাইল / পাথ ম্যানিপুলেশন শ্রেণি - ফাইল :: অনুসন্ধান নেট। এর চেয়ে আরও বেশি অপারেটিং সিস্টেমে কাজ করে

শ্বেত স্পেস সীমানা তালিকা এবং স্ট্রিংয়ের জন্য উদ্ধৃতি - পার্ল আপনাকে আপনার তালিকা এবং স্ট্রিং ডিলিমিটারগুলির জন্য প্রায় স্বেচ্ছাচারী উদ্ধৃতিগুলি চয়ন করতে দেয়

অ্যালিয়াসেবল নেমস্পেসস - পার্লের গ্লোব অ্যাসাইনমেন্টগুলির মাধ্যমে রয়েছে:

*My::Namespace:: = \%Your::Namespace

স্ট্যাটিক ইনিশিয়ালাইজার্স - পার্ল সংকলন এবং অবজেক্ট ইনস্ট্যান্টেশনের প্রায় প্রতিটি ধাপে কোড চালাতে পারে, BEGIN(কোড পার্সে) থেকে (কোড পার্সের CHECKপরে) থেকে import(মডিউল আমদানিতে) থেকে new(অবজেক্ট ইনস্ট্যান্টেশন) থেকে DESTROY(অবজেক্ট ধ্বংস) থেকে END(প্রোগ্রামের প্রস্থান)

কার্যগুলি প্রথম শ্রেণীর নাগরিক - ঠিক যেমন পার্লের মতো

ব্লক স্কোপ এবং ক্লোজার - পার্ল দুটি রয়েছে

কোনও ভেরিয়েবলের মাধ্যমে অপ্রত্যক্ষভাবে কল করার পদ্ধতি এবং অ্যাক্সেসরগুলি - পার্ল এটিও করেন:

my $method = 'foo';
my $obj = My::Class->new();
$obj->$method( 'baz' ); # calls $obj->foo( 'baz' )

কোডের মাধ্যমে পদ্ধতিগুলির সংজ্ঞা দেওয়া - পার্ল সেটিও অনুমতি দেয় :

*foo = sub { print "Hello world" };

বিস্তৃত অনলাইন ডকুমেন্টেশন - পার্ল ডকুমেন্টেশন অনলাইনে এবং সম্ভবত আপনার সিস্টেমেও রয়েছে

আপনি যখনই "অস্তিত্বহীন" ফাংশনটি কল করবেন তখন যাদুবিদ্যার পদ্ধতিগুলি কল করা হয় - পার্ল প্রয়োগ করে যে স্বয়ংক্রিয় ফাংশনে

প্রতীকী রেফারেন্স - আপনাকে এগুলি থেকে দূরে থাকার জন্য ভাল পরামর্শ দেওয়া হচ্ছে। তারা আপনার বাচ্চাদের খাওয়া হবে। তবে অবশ্যই, পার্ল আপনাকে আপনার বাচ্চাদের রক্ত-তৃষ্ণার্ত ভূতে উত্সর্গ করার অনুমতি দেয়।

এক লাইনের মান অদলবদল - পার্ল তালিকা কার্য সম্পাদনের অনুমতি দেয় allows

এমনকি আপনার নিজের কার্যকারিতা সহ কোর ফাংশনগুলি প্রতিস্থাপনের ক্ষমতা

use subs 'unlink'; 
sub unlink { print 'No.' }

অথবা

BEGIN{
    *CORE::GLOBAL::unlink = sub {print 'no'}
};

unlink($_) for @ARGV

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

9
"পার্ল যে জিনিসটি না করতে পারে তা হ'ল আপনার কোডে স্বেচ্ছাসেবী ইউআরএল রয়েছে, কারণ // অপারেটর নিয়মিত প্রকাশের জন্য ব্যবহৃত হয়।" - এটি একেবারে বাজে কথা।

আপনার অন্তর্দৃষ্টি জন্য ধন্যবাদ। আমি উত্স ফিল্টার ব্যবহার না করে পার্ল কোডে খালি HTTP: // ... ইউআরএল রাখার কিছু উপায় দেখেছি এবং কোনও উপায় খুঁজে পাইনি ayআমি আপনি কীভাবে এটি সম্ভব তা দেখাতে পারেন? // 5.8.x অবধি পার্ল সংস্করণগুলিতে নিয়মিত প্রকাশের জন্য ব্যবহৃত হয়।
কোরিয়ন

8
আপনি / কেন আপনার কোডে খালি ইউআরএল চান ? আমি উদাহরণের কথা ভাবতে পারি না।
জাহাজডুবি

18
কেউ এটি চাইবে না, এটি কেবল একটি জাভা মিম। " foo.com " হ'ল লেবেল HTTP: এবং তারপরে একটি মন্তব্যে "foo.com"। কিছু লোক এটিকে আকর্ষণীয় বলে মনে করে কারণ ... তারা বোবা।
jrockway

35

অটোভিভিফিকেশন । আফাইকের অন্য কোনও ভাষাতে এটি নেই


পাইথন, ইত্যাদি, এটি সমর্থন করে না সে সম্পর্কে আমার কোনও ধারণা ছিল না।
skiphoppy

@ ডেভিডনিকল: সত্যি? তুমি কি একটি লিংক সরবরাহ করতে পার? গুগলে আমার দ্রুত অনুসন্ধান কিছুই ফিরিয়ে দেয়নি। যারা ECMAscript জানেন না তাদের জন্য জাভাস্ক্রিপ্টের সঠিক নাম। en.wikedia.org/wiki/ECMAScript
জেজে

1
এবং অটোভিকেশন অক্ষম করার জন্য একটি মডিউল রয়েছে
আলেকজান্ডার সিওরনি

1
@ গ্রেগ লিন্ড - প্রদত্ত যে পাইথন স্বয়ংক্রিয়ভাবে ভেরিয়েবল তৈরি করে যখনই আপনি প্রথমে তাদেরকে অর্পণ করেন, অটোভিভিফিকেশন একক টাইপের বাইরে ভয়াবহ সমস্যা তৈরি করে।
ক্রিস লুৎজ

3
@ ট্রিচ্রিস্ট - এ = [[এক্স * ওয়াই ওয়াই ইন এক্সরেঞ্জ (১,১১)] এক্স ইন এক্সরেঞ্জে (১,১১)]
সর্বজ্ঞ

31

পার্লের প্রায় কোনও ধরণের অদ্ভুত স্ট্রিংয়ের উদ্ধৃতি দেওয়া সহজ।

my $url = q{http://my.url.com/any/arbitrary/path/in/the/url.html};

আসলে পার্লের বিভিন্ন উদ্ধৃতিপ্রযুক্তি ব্যবস্থা বেশ আকর্ষণীয়। পার্ল রেজেেক্স-জাতীয় উদ্ধৃতি ব্যবস্থা আপনাকে ডিলিমিটারগুলি নির্দিষ্ট করে আপনাকে যে কোনও কিছু উদ্ধৃত করতে দেয়। আপনি #, /, অথবা (), [], বা {like এর মতো ওপেন / ক্লোজ অক্ষরের মতো প্রায় কোনও বিশেষ অক্ষর ব্যবহার করতে পারেন} উদাহরণ:

my $var  = q#some string where the pound is the final escape.#;
my $var2 = q{A more pleasant way of escaping.};
my $var3 = q(Others prefer parens as the quote mechanism.);

উদ্ধৃতি পদ্ধতি:

প্রশ্ন: আক্ষরিক উক্তি; কেবলমাত্র যে চরিত্রটি পালাতে হবে তা হ'ল শেষ চরিত্র। প্রশ্নোত্তর: একটি ব্যাখ্যা উদ্ধৃতি; ভেরিয়েবল এবং পলায়ন অক্ষর প্রক্রিয়া। স্ট্রিংগুলির জন্য দুর্দান্ত যা আপনাকে উদ্ধৃত করতে হবে:

my $var4 = qq{This "$mechanism" is broken.  Please inform "$user" at "$email" about it.};

কিউএক্স: কিউকিউয়ের মতো কাজ করে তবে এটি ইন্টারেক্টিভভাবে সিস্টেম কমান্ড হিসাবে কার্যকর করে। স্ট্যান্ডার্ড আউট থেকে উত্পন্ন সমস্ত পাঠ্য ফেরত দেয়। (ওএসে সমর্থিত হলে পুনঃনির্দেশও বেরিয়ে আসে) ব্যাক কোট (`চরিত্র) দিয়েও সম্পন্ন করা হয়।

my $output  = qx{type "$path"};      # get just the output
my $moreout = qx{type "$path" 2>&1}; # get stuff on stderr too

কিউআর: কিউকিউর মতো ব্যাখ্যা করে তবে এটি নিয়মিত প্রকাশ হিসাবে সংকলন করে। পাশাপাশি রেজেক্সে বিভিন্ন বিকল্পের সাথে কাজ করে। আপনি এখন পরিবর্তনশীল হিসাবে চারপাশে রেজেক্স পাস করতে পারেন:

sub MyRegexCheck {
    my ($string, $regex) = @_;
    if ($string)
    {
       return ($string =~ $regex);
    }
    return; # returns 'null' or 'empty' in every context
}

my $regex = qr{http://[\w]\.com/([\w]+/)+};
@results = MyRegexCheck(q{http://myurl.com/subpath1/subpath2/}, $regex);

কিউডাব্লু: একটি খুব, খুব দরকারী উদ্ধৃতি অপারেটর। শ্বেতস্পেসে পৃথক শব্দের একটি উদ্ধৃত সেটকে তালিকায় পরিণত করে। ইউনিট পরীক্ষায় ডেটা পূরণের জন্য দুর্দান্ত।


   my @allowed = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { });
   my @badwords = qw(WORD1 word2 word3 word4);
   my @numbers = qw(one two three four 5 six seven); # works with numbers too
   my @list = ('string with space', qw(eight nine), "a $var"); # works in other lists
   my $arrayref = [ qw(and it works in arrays too) ]; 

যখনই বিষয়গুলি স্পষ্ট হয় তখন এগুলি ব্যবহার করতে তারা দুর্দান্ত। কিউএক্স, কিউ, এবং কি এর জন্য আমি সম্ভবত {} অপারেটরগুলি ব্যবহার করি। কিউডাব্লু ব্যবহার করার সবচেয়ে সাধারণ অভ্যাসটি সাধারণত () অপারেটর, তবে কখনও কখনও আপনি QW // দেখতেও পান।


1
আমি মাঝে মাঝে qw "" ব্যবহার করি যাতে সিনট্যাক্স হাইলাইটারগুলি এটি সঠিকভাবে হাইলাইট করে।
ব্র্যাড গিলবার্ট

স্লিকএডিটে আমার জন্য কাজ করে। :)
রবার্ট পি 0

1
@ ফেনশাউন, আমি সাধারণত যে সম্পাদকগুলি ব্যবহার করি সেগুলি এগুলি সঠিকভাবে হাইলাইট করে। আমি স্ট্যাকওভারফ্লোতে সিনট্যাক্স হাইলাইটারের অংশটি উল্লেখ করছিলাম।
ব্র্যাড গিলবার্ট

@ ব্র্যাড গিলবার্ট: স্ট্যাক ওভারফ্লো পার্লকে মূল্যহীন স্কোয়াটের (পার্সের পার্স) পার্স করতে পারে না ☹
tchrist

my $moreout = qx{type "$path" 2>&1};... আমি জানতাম না যে আপনি এটা করতে পারবেন! [টিএম]
dland

27

সত্যই লুকানো নয়, তবে পার্ল প্রোগ্রামাররা প্রতিদিন CPAN সম্পর্কে জানেন না । এটি বিশেষত এমন লোকদের জন্য প্রযোজ্য যারা পুরো সময়ের প্রোগ্রামার নন বা পার্লে পুরো সময় প্রোগ্রাম করেন না।


27

"ফর" স্টেটমেন্টটি পাসকালে "উইথ" একইভাবে ব্যবহার করা যেতে পারে:

for ($item)
{
    s/&‎nbsp;/ /g;
    s/<.*?>/ /g;
    $_ = join(" ", split(" ", $_));
}

আপনি ভেরিয়েবলের নামটি পুনরুক্ত না করে একই ভেরিয়েবলে s /// ক্রিয়াকলাপ ইত্যাদির ক্রম প্রয়োগ করতে পারেন।

দ্রষ্টব্য: উপরের অ-ব্রেকিং স্পেস (& nbsp;) মার্কডাউনটিকে অবরুদ্ধ করার জন্য এতে ইউনিকোড লুকিয়ে রেখেছে। এটি পেস্ট কপি করবেন না :)


এবং "মানচিত্র" একই কৌশল করে ... মানচিত্র {....}; আইটেম; "ওভার" ম্যাপ "জন্য" ব্যবহার করার একটি সুবিধা হ'ল আপনি ব্রেক আউট করার জন্য ব্যবহার করতে পারেন।
draegtun

2
এছাড়াও, কোডটি ম্যানিপুলেটিংয়ের আগে আইটেমটির তালিকাভুক্ত করা হয়েছে, যা আরও ভাল পাঠযোগ্যতার দিকে নিয়ে যায়।
রবার্ট পি

@ রবার্টপি: একদম ঠিক আছে। একটি টপিকলাইজার বক্তৃতা করতে দরকারী।
tchrist

26

কোটওয়ার্ড অপারেটর আমার প্রিয় জিনিসগুলির মধ্যে একটি। তুলনা করা:

my @list = ('abc', 'def', 'ghi', 'jkl');

এবং

my @list = qw(abc def ghi jkl);

খুব কম শব্দ, চোখের উপর সহজ। পার্ল সম্পর্কে আরও একটি দুর্দান্ত জিনিস, এসকিউএল লেখার সময় যেটি সত্যিই মিস করে, তা হ'ল একটি পিছনের কমাটি আইনী:

print 1, 2, 3, ;

এটি দেখতে অদ্ভুত লাগছে, তবে আপনি কোডটি অন্য কোনও উপায়ে প্রবেশ না করলে নয়:

print
    results_of_foo(),
    results_of_xyzzy(),
    results_of_quux(),
    ;

ফাংশন কলে একটি অতিরিক্ত যুক্তি যুক্ত করার জন্য আপনার আগের বা পিছনের লাইনে কমা দিয়ে ঘুরে বেড়াতে হবে না। একক লাইন পরিবর্তন এর আশেপাশের লাইনে কোনও প্রভাব ফেলবে না।

এটি ভেরিয়াদিক ফাংশনগুলির সাথে কাজ করতে খুব আনন্দদায়ক করে তোলে। এটি পার্লের সবচেয়ে আন্ডার-রেটেড বৈশিষ্ট্যগুলির মধ্যে একটি।


2
পার্লের সিনট্যাক্সের একটি আকর্ষণীয় কর্নার কেসটি হ'ল নিম্নলিখিতটি বৈধ: $ _ কিউডব্লিউ (স্টাফের একটি তালিকা) {...}
প্রশংসিত

1
এমনকি শব্দের উদ্ধৃতি দেওয়ার জন্য আপনি গ্লোব সিনট্যাক্সকে অপব্যবহার করতে পারেন, যতক্ষণ আপনি *? এর মতো বিশেষ অক্ষর ব্যবহার করেন না। সুতরাং আপনি লিখতে পারেনfor (<a list of stuff>) { ... }
মরিৎজ

1
@ ফেফেমেন্ট: প্রায়। এটি কেবল লেক্সিকেলের সাথে কাজ করে: আমার q x কিউডাব্লু (এবিসি) এর জন্য {...} উদাহরণস্বরূপ: $ _ কিউডাব্লু (এবিসি) জন্য {মুদ্রণ} # কিছুই প্রিন্ট করে না
dland

আপনি যখন পার্লের প্রিয় ডিফল্টটি উপভোগ করতে পারবেন তখন কেন এই অতিরিক্ত লেসিকাল যুক্ত করবেন? (qw / abcd /) {মুদ্রণের জন্য; }
ফেংসশাঁ

2
@ephemient, @fengshaun, @moritz, @dland: এর "fixed" এটা তো blead ; দেখতে এই p5p থ্রেড
tchrist

26

ডেটা পার্স করার ক্ষমতাটি সরাসরি একটি ডেটা ব্লকে আটকানো হয় । প্রোগ্রামে বা অনুরূপ খোলার জন্য কোনও পরীক্ষার ফাইলে সংরক্ষণ করার দরকার নেই। উদাহরণ স্বরূপ:

my @lines = <DATA>;
for (@lines) {
    print if /bad/;
}

__DATA__
some good data
some bad data
more good data 
more good data 

এবং সামান্য পরীক্ষায় খুব দরকারী!
ফেংসশাঁ

@ পিটার মর্টেনসেন কীভাবে আপনার একাধিক ব্লক থাকবে? এবং আপনি কিভাবে একটি ব্লক শেষ করবেন?
তুষারপাত

@ টোড: এটি অ্যালানের উত্তর (পুনর্বিবেচনার তালিকাটি দেখুন)। ব্যবহারকারীকে সম্বোধন করা ভাল is অথবা, যেমন ব্যবহারকারী স্ট্যাক ওভারফ্লো ছেড়ে গেছে, সম্ভবত বিশেষভাবে কাউকে সম্বোধন করবেন না (যাতে একজন প্রকৃত পার্ল বিশেষজ্ঞ পরে এটিকে সোজা করতে পারেন)।
পিটার মর্টেনসেন

3
@ হাই: না এটি কুরুচিপূর্ণ নয় - বাস্তবে এটি কুৎসিতের সম্পূর্ণ বিপরীত: এটি পরিষ্কার, স্বল্প, ন্যূনতম এবং সুন্দর; এক কথায়, এটি দুর্দান্ত, এবং এটি ছাড়া ভাষাগুলি পিটাই। @ পিটার মর্টেনসেন, @ টোড: একই প্রোগ্রামে একাধিক ডেটা ব্লক কীভাবে রাখবেন তার একটি উত্তর হ'ল সিপিএএন-র ইনলাইন :: ফাইল মডিউলটি ব্যবহার করা ।
tchrist

ইনলাইন :: ফাইলগুলি উত্স ফিল্টার ব্যবহার করে প্রয়োগ করা হয়। এছাড়াও রয়েছে ডেটা :: বিভাগ যা একাধিক ইনলাইন ব্লক সরবরাহ করে এবং উত্স ফিল্টার ব্যবহার করে না।
প্রকাশ কে

24

নতুন ব্লক অপারেশন

আমি বলবো ভাষা প্রসারিত করার ক্ষমতা, সিউডো ব্লক ক্রিয়াকলাপ তৈরি করা একটাই।

  1. আপনি সাবটির জন্য প্রোটোটাইপ ঘোষণা করুন এটি নির্দেশ করে যে এটি প্রথমে কোড রেফারেন্স নেয়:

    sub do_stuff_with_a_hash (&\%) {
        my ( $block_of_code, $hash_ref ) = @_;
        while ( my ( $k, $v ) = each %$hash_ref ) { 
            $block_of_code->( $k, $v );
        }
    }
  2. তারপরে আপনি এটির মতো শরীরে এটি কল করতে পারেন

    use Data::Dumper;
    
    do_stuff_with_a_hash {
        local $Data::Dumper::Terse = 1;
        my ( $k, $v ) = @_;
        say qq(Hey, the key   is "$k"!);
        say sprintf qq(Hey, the value is "%v"!), Dumper( $v );
    
    } %stuff_for
    ;

( Data::Dumper::Dumperএটি অন্য একটি আধা-লুকানো রত্ন।) লক্ষ্য করুন কীভাবে আপনাকে subব্লকের সামনে কীওয়ার্ড বা হ্যাশের আগে কমা দরকার নেই the এটি অনেকটা দেখার মতো শেষ হয়:map { } @list

উত্স ফিল্টার

এছাড়াও, উত্স ফিল্টার আছে। যেখানে পার্ল আপনাকে কোডটি পাস করবে যাতে আপনি এটি ব্যবহার করতে পারেন। এটি এবং ব্লক ক্রিয়াকলাপ উভয়ই বাড়ির ধরণের জিনিসের চেষ্টা করে না।

আমি উত্স ফিল্টারগুলি দিয়ে কিছু ঝরঝরে কাজ করেছি, উদাহরণস্বরূপ, সময়টি যাচাই করার জন্য খুব সাধারণ ভাষা তৈরি করা, কিছু সিদ্ধান্ত নেওয়ার জন্য সংক্ষিপ্ত পার্ল ওয়ান-লাইনারকে অনুমতি দেওয়া:

perl -MLib::DB -MLib::TL -e 'run_expensive_database_delete() if $hour_of_day < AM_7';

Lib::TL কেবল "ভেরিয়েবল" এবং ধ্রুবক উভয়কেই স্ক্যান করে, তাদের তৈরি করে এবং প্রয়োজনীয় হিসাবে তাদের প্রতিস্থাপন করবে।

আবার উত্স ফিল্টারগুলি অগোছালো হতে পারে তবে শক্তিশালী। তবে তারা ডিবাগারগুলিকে ভয়ঙ্কর কিছুতে জবাবদিহি করতে পারে - এবং এমনকি সতর্কতাগুলি ভুল লাইন নম্বর দিয়ে মুদ্রণ করা যেতে পারে। আমি দামিয়ানস স্যুইচটি ব্যবহার বন্ধ করে দিয়েছি কারণ আমি সত্যই কোথায় ছিল তা বলার সমস্ত ক্ষমতা হারাবে the তবে আমি খুঁজে পেয়েছি যে কোডের ছোট ছোট বিভাগগুলিকে একই লাইনে রেখে আপনি ক্ষয়টি হ্রাস করতে পারেন।

সিগন্যাল হুকস

এটি প্রায়শই যথেষ্ট হয়, তবে এটি সমস্ত স্পষ্ট নয়। এখানে ডাই হ্যান্ডলার যা পিগি পুরানোটির পিছনে থাকে ks

my $old_die_handler = $SIG{__DIE__};
$SIG{__DIE__}       
    = sub { say q(Hey! I'm DYIN' over here!); goto &$old_die_handler; }
    ;

এর অর্থ কোডে যখনই অন্য কোনও মডিউল মারা যেতে চায়, তারা আপনার কাছে আসবে (অন্য কেউ যদি ধ্বংসাত্মক ওভাররাইট না করে $SIG{__DIE__})। এবং আপনাকে অবহিত করা যেতে পারে যে কারওরকম কিছু জিনিস একটি ত্রুটি।

অবশ্যই, পর্যাপ্ত জিনিসগুলির জন্য আপনি কেবল একটি END { }ব্লক ব্যবহার করতে পারেন , যদি আপনি যা করতে চান তা সমস্ত পরিষ্কার করা হয়।

overload::constant

আপনি আপনার মডিউল অন্তর্ভুক্ত প্যাকেজগুলিতে একটি নির্দিষ্ট ধরণের আক্ষরিক পরিদর্শন করতে পারেন। উদাহরণস্বরূপ, আপনি যদি আপনার সাবটিতে এটি ব্যবহার করেন import:

overload::constant 
    integer => sub { 
        my $lit = shift;
        return $lit > 2_000_000_000 ? Math::BigInt->new( $lit ) : $lit 
    };

এর অর্থ হ'ল কলিং প্যাকেজগুলিতে 2 বিলিয়নের বেশি সংখ্যক প্রতিটি পূর্ণসংখ্যার কোনও Math::BigIntবস্তুতে পরিবর্তিত হবে । ( ওভারলোড :: ধ্রুবক দেখুন )।

গ্রুপযুক্ত পূর্ণসংখ্যার লিটারালস

যখন আমরা এটি করছি। পার্ল আপনাকে বৃহত সংখ্যক তিনটি সংখ্যার গোষ্ঠীতে বিভক্ত করতে দেয় এবং তারপরেও পার্সেবল পূর্ণসংখ্যা পেতে পারে। 2_000_000_000উপরে 2 বিলিয়ন নোট


5
$ Sign { DIE } হ্যান্ডলারগুলি ব্যবহার করার সময় , এটির দৃ strongly ়ভাবে প্রস্তাব দেওয়া হয় যে আপনার প্রোগ্রামটি আসলে মারা যাচ্ছে কিনা, বা কেবল ধরা পড়ছে এমন একটি ব্যতিক্রম ছুঁড়ে দেওয়ার জন্য আপনি $। এসকে পরীক্ষা করে দেখুন। সাধারণত আপনি পরেরটির সাথে হস্তক্ষেপ করতে চান না।
pjf

নতুন ব্লকটি খুব শিক্ষামূলক! আমি ভাবছিলাম এটি একটি ভাষা শব্দার্থক! অনেক ধন্যবাদ.
জিরোকুল

উত্স ফিল্টারটির একটি শিক্ষামূলক ব্যবহার হ'ল পিডিএলের নিসস্লাইস ( pdl.perl.org/?docs=NiceSlice&title=PDL::NiceSlice ) যাতে ->sliceপ্রতিবার একটি স্লাইস প্রয়োজন হয় তখন তাকে পদ্ধতি হিসাবে ব্যবহার করার প্রয়োজন হয় না।
জোয়েল বার্গার

24

বাইনারি "এক্স" হ'ল পুনরাবৃত্তি অপারেটর :

print '-' x 80;     # print row of dashes

এটি তালিকাগুলির সাথেও কাজ করে:

print for (1, 4, 9) x 3; # print 149149149

পার্ল হ্যাকারদের মধ্যে এত জনপ্রিয় হওয়ার কারণেই এটি reason পার্ল -e 'প্রিন্ট 0x000 x 25';
জেজে

4
এর জন্য আমার প্রিয় ব্যবহারটি এসকিউএল INSERT বিবৃতিটির শেষ অংশের জন্য স্থানধারক তৈরি করছে: @p = ('?') X $ n; $ পি = যোগদান (",", @ পি); $ sql = "INSERT ... VALUES ($ p)";
skiphoppy

24

কলঙ্ক পরীক্ষা করা। -tকলঙ্কিত চেকিং সক্ষম করার সাথে, পার্ল মারা যাবে (বা সতর্কতা সহ, ) যদি আপনি কলঙ্কিত ডেটা (মোটামুটিভাবে বলতে, প্রোগ্রামের বাইরের তথ্যগুলি) কোনও অনিরাপদ ফাংশনে (কোনও ফাইল খোলার, একটি বাহ্যিক কমান্ড চালানো ইত্যাদি) পাস করার চেষ্টা করেন তবে die সেটুয়েড স্ক্রিপ্টগুলি বা সিজিআই লিখতে বা স্ক্রিপ্টে ডেটা খাওয়ানো ব্যক্তির চেয়ে স্ক্রিপ্টের আরও বেশি সুবিধাগুলি লেখার সময় এটি খুব সহায়ক।

যাদু গোটো। goto &subএকটি অপ্টিমাইজড লেজ কল করে।

ডিবাগার।

use strictএবং use warnings। এগুলি আপনাকে একগুচ্ছ টাইপস থেকে বাঁচাতে পারে।


1
অন্যান্য ভাষায় এই বৈশিষ্ট্যটি কেন নেই? ব্যবহৃত এই বৈশিষ্ট্যটি পার্ল ওয়েব স্ক্রিপ্টগুলিকে আরও সুরক্ষিত আকারের ক্রম করে।
ম্যাথু লক

22

পথ উপর ভিত্তি করে "-n"এবং "-p"সুইচ পার্ল 5 প্রয়োগ করা হয়, আপনি সহ একটি আপাতদৃষ্টিতে ভুল প্রোগ্রাম লিখতে পারেন }{:

ls |perl -lne 'print $_; }{ print "$. Files"'

যা অভ্যন্তরীণভাবে এই কোডটিতে রূপান্তরিত হয়েছে:

LINE: while (defined($_ = <ARGV>)) {
    print $_; }{ print "$. Files";
}

@ মার্টিন ক্লেটন: কেন এটি বলা হয়?
tchrist

@ ক্রিশ্চট - কারণ এটি মনে হচ্ছে, দুটি লোক নাক ঘষছেন। প্রোফাইলে, যদি আপনি দেখতে পান তবে আমি কী বলতে চাইছি।
মার্টিন ক্লেটন

18

আসুন স্পেসশিপ অপারেটর দিয়ে সহজ শুরু করি ।

$a = 5 <=> 7;  # $a is set to -1
$a = 7 <=> 5;  # $a is set to 1
$a = 6 <=> 6;  # $a is set to 0

1
@ লিওন: সি / সি ++ সংখ্যার জন্য 3 টি মান ফেরত দেয় না। যদি মেমরি পরিবেশন করে তবে স্ট্রিং কোমাপ্রে ফাংশনগুলি কেবলমাত্র 3 টি মান ফেরত যা আমি পুরো এসটিএল ভাষায় জানি। আফাইক পাইথনের 3 টি রিটার্ন সংখ্যার তুলনা নেই। জাভাতে কোনও নির্দিষ্ট 3 রিটার্নের তুলনা হয় না।
জেজে

7
-1/0/1 তুলনা অপারেটরগুলির সম্পর্কে কী দরকারী তা উল্লেখ করার মতো, যেহেতু সবাই জানেন না: আপনি প্রাথমিক বা মাধ্যমিক / ইত্যাদি করার জন্য বা অপারেটরের সাথে তাদের একসাথে চেইন করতে পারেন। প্রকারের। সুতরাং ($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)লোকেরা তাদের শেষ নাম অনুসারে বাছাই করে তবে যদি দুটি ব্যক্তির একই শেষ নাম থাকে তবে তাদের প্রথম নাম অনুসারে তাদের আদেশ দেওয়া হবে।
hobbs

@ জেজে পাইথনের একটি 3-মানের তুলনা রয়েছে: সিএমপি () >>> মুদ্রণ (সিএমপি (5,7), সিম্পি (6,6), সিএমপি (7,5)) (-1, 0, 1)
বুকজার

18

এটি একটি মেটা-উত্তর, তবে পার্ল টিপস সংরক্ষণাগারগুলিতে পার্লের সাহায্যে করা যায় এমন সমস্ত ধরণের আকর্ষণীয় কৌশল রয়েছে। পূর্ববর্তী টিপসের সংরক্ষণাগারটি ব্রাউজ করার জন্য অন-লাইনে রয়েছে এবং মেলিং তালিকা বা অ্যাটম ফিডের মাধ্যমে সদস্যতা নেওয়া যেতে পারে।

আমার কয়েকটি প্রিয় টিপসের মধ্যে রয়েছে পারের সাথে এক্সিকিউটেবল বিল্ডিং , স্বয়ংক্রিয়ভাবে ব্যতিক্রম ছুঁড়ে ফেলার জন্য অটোডি ব্যবহার করা এবং পার্ল ৫.১০ -স্যুইচ এবং স্মার্ট-ম্যাচ কনস্ট্রাক্টসের ব্যবহার ।

প্রকাশ: আমি পার্ল টিপসের অন্যতম লেখক এবং রক্ষণাবেক্ষণকারী, তাই আমি অবশ্যই তাদের সম্পর্কে খুব উচ্চমানের চিন্তা করি। ;)


2
এটি সম্ভবত সেখানে সেরা নথিভুক্ত ভাষাগুলির মধ্যে একটি এবং ডকুমেন্টেশন অনুসন্ধান করার জন্য সরঞ্জামগুলির প্যাটার্ন সেট করে। এই প্রশ্নের তালিকা সম্ভবত অন্য ভাষার মতো প্রয়োজন হয় না।
এক্সিম্যান 21

1
অটোডি দেখতে খুব সুন্দর লাগছে।
j_random_hacker

18

মানচিত্র - এটি কারও কোডটিকে আরও প্রকাশিত করে তোলে তা নয়, কারণ এটি আমাকে এই "কার্যকরী প্রোগ্রামিং" সম্পর্কে আরও কিছুটা পড়ার প্ররোচনা দিয়েছে।


15

লুপগুলিতে চালিয়ে যাওয়া ধারা। এটি প্রতিটি লুপের নীচে কার্যকর করা হবে, এমনকি পরবর্তীগুলিও।

while( <> ){
  print "top of loop\n";
  chomp;

  next if /next/i;
  last if /last/i;

  print "bottom of loop\n";
}continue{
  print "continue\n";
}

15

আমার ভোট পার্লের নিয়মিত অভিব্যক্তিতে (? {}) এবং (?? {{) গোষ্ঠীগুলির পক্ষে যাবে। প্রথমটি পার্ল কোড চালায়, রিটার্ন মানটিকে অগ্রাহ্য করে, দ্বিতীয়টি নিয়মিত এক্সপ্রেশন হিসাবে রিটার্ন মানটি ব্যবহার করে কোড চালায়।


পার্ল এতগুলি রিজেক্সপ এক্সটেনশান আবিষ্কার করেছে যে অন্যান্য প্রোগ্রামগুলি এখন প্রায়শই মূল রিজেক্স ভাষার পরিবর্তে পিসি (পার্ল সামঞ্জস্যপূর্ণ রেজেক্স) ব্যবহার করে।
সেকেন্ড

এখানে ছোট্ট ব্লাবটি পড়ুন perldoc.perl.org/… :-D
জেজে

পার্লের সত্যিকার অর্থে (যতদূর আমি জানি), প্যাকটি নেতৃত্ব দিন, যখন এটি পুনরায় রেজেক্সপ্সে আসে।
ব্র্যাড গিলবার্ট 21

এটি, যতদূর আমি সচেতন, এটি এখনও পরীক্ষামূলক এবং ভবিষ্যতে পার্লসে একইভাবে কাজ নাও করতে পারে। এটি দরকারী নয় তা বলার অপেক্ষা রাখে না, তবে সামান্য নিরাপদ এবং ঠিক যেমন ব্যবহারযোগ্য সংস্করণটি s /// কমান্ডের / ই পতাকাটিতে পাওয়া যায়: s/(pattern)/reverse($1);/ge;# সমস্ত বিপরীত হয় patterns
ক্রিস লুটজ

@ ক্রিস লুটজ, @ লিওন টিমারম্যান: নোট করুন যে এই দুটি কনস্ট্রাক্ট এখন পুনরায় তদন্তকারী। এছাড়াও মনে রাখবেন যে দ্বিতীয়টি আর পুনরুক্তিপূর্ণ প্যাটার্নগুলিতে প্রভাবিত হওয়ার প্রয়োজন নেই, এখন আমরা ক্যাপচার গ্রুপগুলিতে পুনরাবৃত্তি করতে পারি। @ ব্র্যাড গিলবার্ট: এটা ঠিক, যদিও পিসিআরই আমাদের ট্র্যাক করার একটি সৎ কাজ করে; রেজেক্স এক্সিলেন্সের একটি ক্ষেত্র যেখানে পার্ল সম্পূর্ণ অপরিবর্তিত, তার ইউনিকোড বৈশিষ্ট্যে অ্যাক্সেস; আমার unitrio বন্টন দেখতে uninames, unicharsএবং বিশেষত unipropsআমি কি বলতে চাচ্ছি শুধু অংশ দেখতে।
tchrist

13
while(/\G(\b\w*\b)/g) {
     print "$1\n";
}

\ জি অ্যাঙ্কর এটা গরম


3
... এবং এটি আগের ম্যাচের শেষের অবস্থানটি নির্দেশ করে।
ডেভ শেরোহমান

1
তবে আপনাকে স্কেলারের প্রসঙ্গে আপনার রেজেক্সকে কল করতে হবে।
ডেভিডনিকল

@ ডেভিডনিকল: উপরের কোডটি কাজ করে। আপনি কি বলতে চান তা পরিষ্কার করে বলতে পারেন?
জেজে

13

m//অপারেটর কিছু অস্পষ্ট বিশেষ ক্ষেত্রে আছে:

  • আপনি যদি ?ডিলিমিটার হিসাবে ব্যবহার করেন তবে এটি কল না করা মাত্র একবারেই মেলে reset
  • আপনি যদি 'ডিলিমিটার হিসাবে ব্যবহার করেন তবে প্যাটার্নটি বিভক্ত নয়।
  • প্যাটার্নটি খালি থাকলে এটি শেষ সফল ম্যাচ থেকে প্যাটার্নটি ব্যবহার করে।

2
এগুলি লুকানো বৈশিষ্ট্যগুলির চেয়ে গোপন গ্যাচচের মতো! তাদের পছন্দ করে এমন কাউকে আমি চিনি না। কিছুক্ষণ আগে পি 5 পি-তে একটি থ্রেড একটি প্যাটিভেটিভ মি / $ ফু / আর পতাকাটির কার্যকারিতা নিয়ে আলোচনা করেছিল, যেখানে / আর এর অর্থ কোনও বিরক্তি নয় (চিঠিটি গুরুত্বপূর্ণ নয়) যেহেতু কেউ কখনও একক উদ্ধৃতি জিনিস মনে রাখতে পারে না।
dland

2
@ ডল্যান্ড: সম্মত; আমি এই লুকানো ভুল বৈশিষ্ট্যগুলি কল করতাম এবং সেগুলি কখনও উত্পাদন কোডে ব্যবহার করতাম না।
মাইকেল কারম্যান 16

7
আমি কোনও পার্ল প্রোগ্রামার মনে রাখতে অক্ষম (বা এমনকি অনুমান) করতে পারছি না যে একক উদ্ধৃতি কোনও প্রক্ষেপণ নয় stand এই শব্দার্থবিজ্ঞানের সাথে এর ব্যবহারটি প্রায় সর্বজনীন যে ভাষায় আমি বরং এটি
এমনটিই

এবং যদি প্যাটার্নটি খালি থাকে এবং সর্বশেষ সফল ম্যাচটি / o সংশোধকটির সাথে সংকলিত হয়, তখন থেকে এটি সেই ধরণীতে আটকে থাকবে।
ডেভিডনিকল

1
আমি মনে করি খালি প্যাটার্ন আচরণটি অবহেলা করা হয়েছে। মূলত কারণ / ফু ফাঁকা থাকলে এম / $ ফু / এর মতো প্যাটার্নটি একটি বাজে বাগে পরিণত হয়।
ম্যাথু এস

12

নাল ফাইলহ্যান্ডেল ডায়মন্ড অপারেটরটির <> কমান্ড লাইন সরঞ্জামগুলি তৈরিতে এর স্থান রয়েছে। এটি <FH>হ্যান্ডেল থেকে পড়ার মতো কাজ করে , প্রথমে যা পাওয়া যায় তা যাদুকরীভাবে নির্বাচন করে: কমান্ড লাইন ফাইলের নাম বা এসটিডিএন। পারলপ থেকে নেওয়া:

while (<>) {
...         # code for each line
}

4
এছাড়া ব্যবহারের ইউনিক্স শব্দার্থবিদ্যা অনুসরণ "-" "মানে stdin থেকে পড়া করতে পারতেন তা তো। perl myscript.pl file1.txt - file2.txt, এবং Perl প্রথম ফাইল, তারপর stdin, তারপর দ্বিতীয় ফাইলটি প্রক্রিয়া হবে।
রায়ান সি থম্পসন

আপনি আপনার নিজের বস্তুর উপর অপারেটর ( ) একটি পুনরুক্তিকারীর মত কাজ। তবে তালিকার প্রসঙ্গে আপনি যেমন আশা করতে পারেন তেমন এটি কার্যকর হয় না। overload<><$var>
ডলম্যান

11

যেমন বিশেষ কোড ব্লকBEGIN , CHECKএবং END। তারা আওক থেকে আসে তবে পার্লে আলাদাভাবে কাজ করে, কারণ এটি রেকর্ড ভিত্তিক নয়।

BEGINব্লক পার্সিং ফেজ জন্য কিছু কোড উল্লেখ করার জন্য ব্যবহার করা যেতে পারে; আপনি সিনট্যাক্স এবং ভেরিয়েবল-চেক করার সময় এটি কার্যকর করা হয় perl -c। উদাহরণস্বরূপ, কনফিগারেশন ভেরিয়েবলগুলি লোড করতে:

BEGIN {
    eval {
        require 'config.local.pl';
    };
    if ($@) {
        require 'config.default.pl';
    }
}

11
rename("$_.part", $_) for "data.txt";

নিজেকে পুনরাবৃত্তি না করে ডেটা.টেক্সট.পার্টটির নাম পরিবর্তন করে।


10

কিছুটা অস্পষ্ট হ'ল টিল্ড-টিল্ড "অপারেটর" যা স্কেলারের প্রসঙ্গে জোর করে।

print ~~ localtime;

হিসাবে একই

print scalar localtime;

এবং থেকে পৃথক

print localtime;

5
এটি বিশেষত অস্পষ্ট কারণ Perl5.10.0 এছাড়াও "স্মার্ট ম্যাচ অপারেটর" প্রবর্তন করে ~~, যা রিজেক্স ম্যাচগুলি করতে পারে, দেখতে পারে কোনও আইটেম অ্যারেতে অন্তর্ভুক্ত রয়েছে কিনা ইত্যাদি।
মরিৎজ

এটি অস্পষ্ট নয়, এটি অস্পষ্ট (এবং গল্ফ এবং জেএফএইচএস জন্য দরকারী)।
মাইকেল কারম্যান 13

এটা ঠিক নয়! ferences রেফারেন্সে নিরাপদ নয়! এটি তাদের শক্তিশালী করে।
লিওন টিমারম্যানস 15

হ্যাঁ ঠিক. স্ট্রালিফিকেশন হ'ল স্কেলারের প্রসঙ্গে বাধ্য হয়ে রেফারেন্সগুলির সাথে কী ঘটে। এটি কীভাবে "~~ বাহিনীকে স্ক্যালার প্রসঙ্গে" ভুল করে?
ডেভ শেরোহমান

3
@ নোমাদ দরবেশ: স্কেলারের প্রসঙ্গ / = স্ট্রিংফিকেশন। উদাহরণস্বরূপ "$ n = @ একটি" স্কেলার প্রসঙ্গে। "$ s = qq '@ a'" স্ট্রিংফিকেশন ification রেফারেন্স সম্পর্কিত, "$ ref1 = $ ref2" স্কেলার প্রসঙ্গে, তবে স্ট্রাইফাই হয় না।
মাইকেল কারম্যান 17


9

পার্লের লুপ কন্ট্রাক্ট কনস্ট্রাক্টসের "হতাশার মোড" যার ফলে তারা একটি মেলানো লেবেল সন্ধানের জন্য স্ট্যাকটি সন্ধান করে এবং কিছু উত্সাহী আচরণের অনুমতি দেয় যা আরও ভাল বা খারাপ হিসাবে টেস্ট :: আরও বেশি সুবিধা নেয়।

SKIP: {
    skip() if $something;

    print "Never printed";
}

sub skip {
    no warnings "exiting";
    last SKIP;
}

এখানে খুব অল্প পরিচিত পিএমসি ফাইল রয়েছে। "ইউজু ফু" Foo.pm এর আগে @INC- এ Foo.pmc সন্ধান করবে। এটি সংকলিত বাইকোডকে প্রথমে লোড করার অনুমতি দেওয়ার উদ্দেশ্যে করা হয়েছিল, তবে মডিউল :: কমপিলে দ্রুত লোডের সময় এবং সহজ ডিবাগিংয়ের জন্য উত্স ফিল্টারযুক্ত মডিউলগুলি ক্যাশে এটির সুবিধা গ্রহণ করে।

সতর্কতাগুলিকে ত্রুটিতে পরিণত করার ক্ষমতা।

local $SIG{__WARN__} = sub { die @_ };
$num = "two";
$sum = 1 + $num;
print "Never reached";

এটাই আমি আমার মাথার উপরের অংশের কথা ভাবতে পারি যা উল্লেখ করা হয়নি।


9

ছাগল অপারেটর *:

$_ = "foo bar";
my $count =()= /[aeiou]/g; #3

অথবা

sub foo {
    return @_;
}

$count =()= foo(qw/a b c d/); #4

এটি কাজ করে কারণ স্কেলারের প্রসঙ্গে তালিকার অ্যাসাইনমেন্ট তালিকাভুক্ত হওয়া উপাদানের সংখ্যা নির্ধারণ করে।

* দ্রষ্টব্য, আসলেই অপারেটর নয়


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