একটি রাষ্ট্রের সাথে আপনার বিকল্প দরকার। আমার মনে আছে এসও-তে এই ধরণের সমস্যার সম্পূর্ণ সমাধান (/ বেশ কয়েকটি?) সরবরাহ করা হয়েছে ।
এগিয়ে যাওয়ার আরও একটি উপায় এখানে (1)। এখন, আমি 2 ধাপে এগিয়ে যাব:
- একটি নোংরা তালিকা ভেরিয়েবলের জন্য আমি যে নোংরা এবং সংশ্লেষিত ট্রিকটি ব্যবহার করব তার জন্য আমার প্রয়োজন
- একটি প্রতিস্থাপন যেখানে আমি এই ডামি অ্যারের লেনটি সন্নিবেশ করান আমি প্রতিটি মিলে যাওয়া ঘটনাটি পূরণ করছি।
যা দেয়:
:let t=[]
:%s/#\zs\d\+\(\.\d\+\)\=\ze/\=len(add(t,1))/g
যদি আপনি রেজিগেসগুলি ভিম করতে ব্যবহার না করেন তবে আমি কোন সাব-প্যাটার্নটি মিল করছি তা নির্দিষ্ট করতে :h /\zs
এবং ব্যবহার \ze
করার জন্য, আমি সম্ভবত একটি বিন্দু এবং অন্যান্য অঙ্কগুলি অনুসরণ করে একটি সংখ্যার অঙ্কের সাথে মেলে। এটি কোনও ভাসমান পয়েন্ট সংখ্যাটির জন্য উপযুক্ত নয়, তবে এটি এখানে যথেষ্ট।
দ্রষ্টব্য: একটি সাধারণ ইন্টারফেসের জন্য আপনাকে এটি একটি কাপল ফাংশন + কমান্ডে আবদ্ধ করতে হবে। আবার এসও / ভিমে-র উদাহরণ রয়েছে ( এখানে , এখানে , এখানে ) আজকাল আমি এই কৌশলটি কোনও আদেশে মোড়ানো সম্পর্কে যত্ন নেওয়ার জন্য যথেষ্ট পরিমাণ ভিম জানি। প্রকৃতপক্ষে আমি প্রথম কমান্ডে এই কমান্ডটি লিখতে সক্ষম হব, যখন আমি কমান্ডের নাম মনে রাখতে কয়েক মিনিট সময় নেব।
(1) উদ্দেশ্যটি হ'ল বিকল্প ব্যবস্থার মধ্যে একটি রাজ্য বজায় রাখতে সক্ষম হওয়া এবং বর্তমান পরিস্থিতির উপর নির্ভর করে এমন কোনও পরিস্থিতির সাথে বর্তমান পরিস্থিতিটি প্রতিস্থাপন করা।
ধন্যবাদ :s\=
আমরা একটি গণনার ফলে কিছু সন্নিবেশ করতে সক্ষম।
রাজ্যের সমস্যা থেকে যায়। হয় আমরা কোনও ফাংশনটি সংজ্ঞায়িত করি যা একটি বাহ্যিক অবস্থা পরিচালনা করে, বা আমরা নিজেরাই একটি বাহ্যিক অবস্থা আপডেট করি। সিতে (এবং সম্পর্কিত ভাষাগুলি), আমরা এর মতো length++
বা ব্যবহার করতে পারতাম length+=1
। দুর্ভাগ্যক্রমে, ভিম স্ক্রিপ্টগুলিতে, +=
বাক্সের বাইরে ব্যবহার করা যায় না। এটি সাথে :set
বা সাথে ব্যবহার করা প্রয়োজন :let
। এর অর্থ হ'ল :let length+=1
কোনও সংখ্যা বাড়িয়ে দেয় তবে কিছুই ফেরায় না। আমরা লিখতে পারি না :s/pattern/\=(length+=1)
। আমাদের অন্য কিছু দরকার।
আমাদের পরিবর্তনের কাজগুলি দরকার need অর্থাত ফাংশন যা তাদের ইনপুটগুলিকে পরিবর্তন করে। আমরা আশা করি আপনি setreg()
, map()
, add()
এবং সম্ভবত আরও অনেক কিছু। তাদের দিয়ে শুরু করা যাক।
setreg()
একটি রেজিস্টার পরিবর্তন। পারফেক্ট। আমরা setreg('a',@a+1)
@ ডক্টর ওসওয়াল্ডো এর সমাধান হিসাবে লিখতে পারি । এবং এখনও, এটি যথেষ্ট নয়। setreg()
একটি ফাংশন চেয়ে প্রক্রিয়া বেশি (আমাদের মধ্যে যারা পাস্কাল, অ্যাডা জানেন ...)। এর অর্থ এটি কোনও কিছুই ফেরায় না। আসলে, এটি কিছু ফিরে আসে। নামমাত্র প্রস্থান (অর্থাত্ ব্যতিক্রমী বহির্গমন) সর্বদা কিছু ফেরত দেয়। ডিফল্টরূপে, যখন আমরা কিছু ফিরিয়ে দিতে ভুলে যাই, 0 ফিরে আসে - এটি বিল্ট-ইন ফাংশনগুলির সাথেও প্রযোজ্য। সে কারণেই তার সমাধানে প্রতিস্থাপনের অভিব্যক্তিটি আসলে \=@a+setreg(...)
। কৌতুক, তাই না?
map()
ব্যবহার করা যেতে পারে। যদি আমরা একটি তালিকা থেকে একটি একক 0 ( :let single_length=[0]
) দিয়ে শুরু করি , আমরা আপনাকে ধন্যবাদ জানাতে পারি map(single_length, 'v:val + 1')
। তারপরে আমাদের নতুন দৈর্ঘ্য ফিরিয়ে আনতে হবে। বিপরীতে setreg()
, map()
তার রূপান্তরিত ইনপুট ফেরত দেয়। এটি নিখুঁত, দৈর্ঘ্যটি তালিকার প্রথম (এবং অনন্য এবং এইভাবে শেষের দিকে) অবস্থিত। প্রতিস্থাপন এক্সপ্রেশন হতে পারে \=map(...)[0]
।
add()
আমি প্রায়শই অভ্যাসের বাইরে ব্যবহার করি (আমি যদিও map()
বাস্তবে প্রায় , এবং আমি এখনও তাদের স্বতন্ত্র পারফরম্যান্সগুলি বঞ্চ করি নি)। ধারণাটি add()
হ'ল বর্তমান রাষ্ট্র হিসাবে একটি তালিকা ব্যবহার করা এবং প্রতিটি প্রতিস্থাপনের আগে শেষে কিছু যুক্ত করা। আমি প্রায়শই তালিকার শেষে নতুন মানটি সঞ্চয় করি এবং প্রতিস্থাপনের জন্য এটি ব্যবহার করি। হিসাবে add()
তার রূপান্তর ইনপুট তালিকা ফেরৎ, আমরা ব্যবহার করতে পারেন: \=add(state, Func(state[-1], submatch(0)))[-1]
। ওপির ক্ষেত্রে, আমাদের কেবল এখনও মনে রাখা দরকার যে এখন পর্যন্ত কতটি ম্যাচ সনাক্ত হয়েছে। এই রাজ্যের তালিকার দৈর্ঘ্য ফিরিয়ে দেওয়া যথেষ্ট। সুতরাং আমার \=len(add(state, whatever))
।
perldo
ব্যবহার করতে পারেন:%perldo s/#\K\d+(\.\d+)?/++$i/ge