সম্ভবত এটি মুছে ফেলার মূল বিষয়টি হ'ল \s
অনুভূমিক এবং উল্লম্ব স্থানের সাথে মেলে । মাত্র অনুভূমিক স্থান মেলে, ব্যবহার করুন \h
, এবং ঠিক উল্লম্ব স্থান মেলে \v
,।
আমার করা একটি ছোট প্রস্তাবনাটি হ'ল টোকেনের নতুনলাইনগুলি অন্তর্ভুক্ত করা। আপনি বিকল্প অপারেটরগুলি %
বা %%
, যেমন তারা এই ধরণের কাজটি পরিচালনা করার জন্য তৈরি করেছেন তাও ব্যবহার করতে চাইতে পারেন :
grammar Parser {
token TOP {
<headerRow> \n
<valueRow>+ %% \n
}
token headerRow { <.ws>* %% <header> }
token valueRow { <.ws>* %% <value> }
token header { \S+ }
token value { \S+ }
token ws { \h* }
}
এর ফলাফল Parser.parse($dat)
নিম্নলিখিত:
「ID Name Email
1 test test@email.com
321 stan stan@nowhere.net
」
headerRow => 「ID Name Email」
header => 「ID」
header => 「Name」
header => 「Email」
valueRow => 「 1 test test@email.com」
value => 「1」
value => 「test」
value => 「test@email.com」
valueRow => 「 321 stan stan@nowhere.net」
value => 「321」
value => 「stan」
value => 「stan@nowhere.net」
valueRow => 「」
যা আমাদের দেখায় যে ব্যাকরণ সফলভাবে সমস্ত কিছু পার্স করেছে। যাইহোক, আসুন আপনার প্রশ্নের দ্বিতীয় অংশটির দিকে মনোনিবেশ করুন, আপনি এটি চান যে এটি আপনার জন্য একটি ভেরিয়েবলে পাওয়া যায়। এটি করার জন্য, আপনাকে একটি ক্রিয়াকলাপ সরবরাহ করতে হবে যা এই প্রকল্পের জন্য খুব সহজ। আপনি কেবল এমন একটি শ্রেণী তৈরি করেছেন যার পদ্ধতিগুলি আপনার ব্যাকরণের পদ্ধতির সাথে মেলে (যদিও খুব সাধারণ বিষয়গুলি যেমন value
/ header
যেগুলিকে স্ট্রিংফিকেশন ছাড়াও বিশেষ প্রক্রিয়াকরণের প্রয়োজন হয় না তবে এড়ানো যায়)। আপনার প্রসেসিং পরিচালনা করার জন্য আরও কিছু সৃজনশীল / কমপ্যাক্ট উপায় রয়েছে, তবে আমি উদাহরণের জন্য মোটামুটি প্রাথমিক পদ্ধতিতে যাব। এখানে আমাদের ক্লাস:
class ParserActions {
method headerRow ($/) { ... }
method valueRow ($/) { ... }
method TOP ($/) { ... }
}
প্রতিটি পদ্ধতিতে স্বাক্ষর থাকে ($/)
যা হ'ল রেগেক্স ম্যাচ ভেরিয়েবল। সুতরাং, এখন প্রতিটি টোকেন থেকে আমরা কী তথ্য চাই জিজ্ঞাসা করা যাক। শিরোলেখের সারিতে, আমরা প্রতিটি একক শিরোনামের মানটি চাই want তাই:
method headerRow ($/) {
my @headers = $<header>.map: *.Str
make @headers;
}
এটি একটি কোয়ান্টিফায়ার সঙ্গে কোন টোকেন হিসেবে গণ্য করা হবে Positional
, তাই আমরা কিছু সঙ্গে প্রতিটি পৃথক হেডার ম্যাচের অ্যাক্সেস করতে পারে $<header>[0]
, $<header>[1]
,, ইত্যাদি কিন্তু ম্যাচ বস্তু তাই আমরা দ্রুত তাদের stringify। make
কমান্ড অন্যান্য টোকেন এই বিশেষ ডেটা রয়েছে যা আমরা তৈরি করেছি অ্যাক্সেসের অনুমতি দেয়।
আমাদের মান সারিটি অভিন্নরূপে দেখবে, কারণ $<value>
টোকেনগুলি আমাদের যা যত্ন করে।
method valueRow ($/) {
my @values = $<value>.map: *.Str
make @values;
}
আমরা শেষ পদ্ধতিতে পৌঁছে গেলে, আমরা হ্যাশ দিয়ে অ্যারে তৈরি করতে চাই।
method TOP ($/) {
my @entries;
my @headers = $<headerRow>.made;
my @rows = $<valueRow>.map: *.made;
for @rows -> @values {
my %entry = flat @headers Z @values;
@entries.push: %entry;
}
make @entries;
}
এখানে আপনি দেখতে পাচ্ছেন যে আমরা যে প্রক্রিয়াতে প্রক্রিয়াকরণ করেছি তাতে কীভাবে অ্যাক্সেস করতে পারি headerRow()
এবং valueRow()
: আপনি .made
পদ্ধতিটি ব্যবহার করেন । যেহেতু একাধিক ভ্যালুআর রয়েছে, তাদের প্রতিটি made
মান পেতে আমাদের একটি মানচিত্র তৈরি করতে হবে (এটি এমন একটি পরিস্থিতি যেখানে আমি আমার ব্যাকরণটি কেবল ব্যাকরণে লেখার ঝোঁক রাখি <header><data>
এবং একাধিক সারি হিসাবে ডেটাটিকে পরাস্ত করি, তবে এটি হ'ল যথেষ্ট সহজ এটি খুব খারাপ নয়)।
এখন যেহেতু আমাদের দুটি শিরোনামে শিরোনাম এবং সারি রয়েছে, কেবল এগুলি হ্যাশগুলির একটি অ্যারে তৈরি করার বিষয়, যা আমরা লুপটিতে করি for
। flat @x Z @y
শুধু উপাদানের intercolates এবং হ্যাশ নিয়োগ আমরা কি মানে, কিন্তু অন্য কোন উপায়ে হ্যাশ অ্যারের যদি আপনি চান পেতে হয়।
একবার আপনি হয়ে গেলে, আপনি কেবল make
এটি করেন, এবং তারপরে এটি made
পার্সে পাওয়া যাবে:
say Parser.parse($dat, :actions(ParserActions)).made
-> [{Email => test@email.com, ID => 1, Name => test} {Email => stan@nowhere.net, ID => 321, Name => stan} {}]
এগুলি কোনও পদ্ধতিতে মোড়ানো মোটামুটি সাধারণ
sub parse-tsv($tsv) {
return Parser.parse($tsv, :actions(ParserActions)).made
}
এইভাবে আপনি বলতে পারেন
my @entries = parse-tsv($dat);
say @entries[0]<Name>; # test
say @entries[1]<Email>; # stan@nowhere.net
Nil
। প্রতিক্রিয়া হিসাবে এটি বেশ বন্ধ্যা হয়, তাই না? ডিবাগ, ডাউনলোডের জন্য commaide যদি আপনি ইতিমধ্যেই না করে, এবং / অথবা দেখতে ব্যাকরণ প্রতিবেদন উন্নত করা ত্রুটি পারেন কিভাবে? । আপনিNil
আপনার প্যাটার্নটি ব্যাকট্র্যাকিং শব্দার্থবিজ্ঞান ধরে নিয়েছেন। সে সম্পর্কে আমার উত্তর দেখুন। আমি আপনাকে ব্যাকট্র্যাকিং বন্ধ করার পরামর্শ দিচ্ছি। সে সম্পর্কে @ user0721090601 এর উত্তর দেখুন। নিখুঁত ব্যবহারিকতা এবং গতির জন্য জেজে উত্তর দেখুন see এছাড়াও, "আমি রাকুর সাথে এক্স পার্স করতে চাই। এর জন্য কেউ পরিচিত হতে পারে?" ।