কীভাবে প্রতিটি ম্যাচ ইনক্রিমেন্টিং কাউন্টারে প্রতিস্থাপন করবেন?


14

আমি নির্দিষ্ট প্যাটার্নের প্রতিটি ঘটনাকে দশমিক সংখ্যার সাথে শুরু 1করতে এবং প্রতি ম্যাচের জন্য একটি করে বাড়িয়ে দিতে চাই।

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

উদাহরণ, আগে:

#1
#1.25
#1.5
#2

পরে:

#1
#2
#3
#4

আমার পুনরায় নাম্বার করতে চাইলে আমার আসল তথ্যটিতে আরও অনেকগুলি পাঠ্য থাকে।


2
আপনার যদি থাকে তবে আপনি perldoব্যবহার করতে পারেন:%perldo s/#\K\d+(\.\d+)?/++$i/ge
সন্দীপ

@ সন্দীপ: আমার উল্লেখ করা উচিত ছিল আমি ভ্যানিলা উইন্ডোজ 10 এ আছি, দুঃখিত!
হিপ্পিট্রেইল

উত্তর:


15

একটি রাষ্ট্রের সাথে আপনার বিকল্প দরকার। আমার মনে আছে এসও-তে এই ধরণের সমস্যার সম্পূর্ণ সমাধান (/ বেশ কয়েকটি?) সরবরাহ করা হয়েছে ।

এগিয়ে যাওয়ার আরও একটি উপায় এখানে (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))


আমি মনে করি আমি এটি বুঝতে পারি, তবে অ্যারে এবং এর দৈর্ঘ্যটি কেন একটি ভেরিয়েবলের সাথে যুক্ত করার তুলনায় দৈর্ঘ্য?
হিপ্পিট্রেইল

1
এর কারণ এটি \=একটি অভিব্যক্তি প্রত্যাশা করে, এবং সি এর বিপরীতে, i+=1এমন কিছু নয় যা বর্ধন করে এবং কোনও অভিব্যক্তি ফিরে দেয়। এর অর্থ হ'ল পিছনে \=আমার এমন কিছু দরকার যা একটি কাউন্টারকে সংশোধন করতে পারে এবং এটি একটি অভিব্যক্তি ফেরত দেয় (সেই কাউন্টারের সমান)। এখনও অবধি কেবলমাত্র আমি খুঁজে পেয়েছি হ'ল তালিকার (এবং অভিধান) ম্যানিপুলেশন ফাংশন। @ ডক্টর ওএসওয়াল্ডো আরও একটি মিউটেশন ফাংশন ব্যবহার করেছেন ( setreg())। পার্থক্য যে setreg()কিছু ফেরৎ না, যার মানে এটা সবসময় সংখ্যা ফেরৎ 0
লুক হার্মিটে

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

2
@hippietrail। ব্যাখ্যা যুক্ত হয়েছে you আপনার আরও নির্দিষ্ট নির্ভুলতা প্রয়োজন কিনা আমাকে জানাবেন।
লুক হার্মিটে

14
 :let @a=1 | %s/search/\='replace'.(@a+setreg('a',@a+1))/g

তবে সাবধান, এটি আপনার নিবন্ধকে ওভাররাইট করবে a। আমি মনে করি এটি লুসের উত্তর চেয়ে কিছুটা সোজা এগিয়ে, তবে সম্ভবত তার দ্রুত হয় his এই সমাধানটি যদি তার থেকে কোনওরকম খারাপ হয় তবে আমি কেন তার উত্তর আরও ভাল সে সম্পর্কে কোনও প্রতিক্রিয়া শুনতে পছন্দ করব। উত্তর উন্নত করতে কোনও প্রতিক্রিয়া অত্যন্ত প্রশংসা করা হবে!

(এটি আমার /programming/43539251/how-to-replace-finding-words-with-tif--in-each-occurrence-in-vi-vim- এর একটি এসও উত্তরের উপর ভিত্তি করে) -দী / 43539546 # 43539546 )


আমি দেখতে পাচ্ছি না যে @a+setreg('a',@a+1)তার চেয়ে খাটো কীভাবে হয় len(add(t,1))। অন্যথায়, এটি একটি দুর্দান্ত অন্যান্য নোংরা কৌশল :) আমি এই এক যদিও না। প্রতিস্থাপন পাঠ্যে অভিধানের পরিবর্তনের ফাংশনটি ব্যবহার করার বিষয়ে :sএবং substitute()আমি উল্লেখ করেছি যে এটি স্পষ্টভাবে লুপগুলি আরও দ্রুত - সুতরাং lh-vim-lib এ আমার তালিকার কার্যকারিতা বাস্তবায়ন করে । আমার ধারণা আপনার সমাধানটি আমার সাথে সমান হবে, কিছুটা দ্রুত হতে পারে, আমি জানি না।
লুক হার্মিটে

2
পছন্দগুলি সম্পর্কে, আমি আমার একক কারণে আমার সমাধানটিকে পছন্দ করি: এটি @aঅবিস্মরণীয় ছেড়ে যায় । স্ক্রিপ্টগুলিতে এটি গুরুত্বপূর্ণ আইএমও। ইন্টারেক্টিভ মোডে থাকাকালীন, একজন ব্যবহারকারী হিসাবে, আমি জানতে পারি যে আমি কোন নিবন্ধ ব্যবহার করতে পারি। একটি রেজিস্টার দিয়ে গণ্ডগোল কম গুরুত্বপূর্ণ। আমার সমাধানে, ইন্টারেক্টিভ মোডে, একটি গ্লোবাল ভেরিয়েবল মিশ্রিত হয়; স্ক্রিপ্টে এটি একটি স্থানীয় ভেরিয়েবল হবে।
লুক হার্মিটে

@ লুচর্মিট দুঃখিত, আমার সমাধানটি আপনার চেয়ে প্রকৃতপক্ষে খাটো নয়, এ জাতীয় বিবৃতি লেখার আগে আমার আরও ভাল করে পড়া উচিত। আমি আমার জবাব থেকে উক্ত বিবৃতিটি সরিয়ে দিয়েছি এবং ক্ষমা চাইতে চাই! আপনার আকর্ষণীয় প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ, আমি এটি প্রশংসা করি।
ডক্টর ওসওয়াল্ডো

এটি সম্পর্কে চিন্তা করবেন না। রেজেক্সের কারণে, এটি টাইপ করার মতো অনেক কিছুই আছে তা ভাবা সহজ। এছাড়াও, আমি স্বেচ্ছায় স্বীকার করি আমার সমাধানটি বিশৃঙ্খল। আপনি প্রতিক্রিয়া জন্য স্বাগত জানাই। :)
লুক হার্মিটে

1
সত্যিই আপনি দৃth়। বেশিরভাগ সময় আমি অ্যারের শেষ অবস্থানে সঞ্চয় করি এমন অন্য তথ্য বের করি যা শেষ পর্যন্ত আমি সন্নিবেশ করি (শেষ উপাদান)। উদাহরণস্বরূপ, একটির জন্য +3, আমি এই জাতীয় কিছু লিখতে পারি \=add(thelist, 3 + get(thelist, -1, 0))[-1]
লুক হার্মিটে

5

আমি বেশ কয়েক বছর আগে জিজ্ঞাসা করা একটি অনুরূপ কিন্তু ভিন্ন প্রশ্ন পেয়েছি এবং আমি কী করছি তা সম্পূর্ণরূপে না বুঝে এর উত্তরগুলির একটির পরিবর্তন করতে সক্ষম হয়েছি এবং এটি দুর্দান্ত কাজ করছে:

:let i = 1 | g/#\d\+\(\.\d\+\)\=/s//\=printf("#%d", i)/ | let i = i+1

বিশেষত আমি বুঝতে পারি না কেন আমার ব্যবহার হয় না %বা কেন আমি কেবল একটি সরল পরিবর্তনশীল ব্যবহার করি যা অন্য উত্তরগুলি কোনও কারণে এড়ানো যায় avoid


1
এটিও একটি সম্ভাবনা। আমি মনে করি এখানে প্রধান অসুবিধা হ'ল, আপনি প্রতি ম্যাচে একটি বিকল্প কমান্ড ব্যবহার করেন। সুতরাং এটি সম্ভবত ধীর। আমরা সরল ভেরিয়েবলটি ব্যবহার না করার কারণটি হ'ল এটি সাধারণ s//gবিবৃতিতে আপডেট হবে না । যাইহোক এটি একটি আকর্ষণীয় সমাধান। হতে পারে @ লুচর্মিটটি আপনাকে ভাল এবং কনস সম্পর্কে আরও বেশি কিছু বলতে পারে, যেহেতু আমার সাথে তার তুলনায় ভিমস্ক্রিপ্ট সম্পর্কে জ্ঞান যথেষ্ট সীমিত।
ডক্টর ওসওয়াল্ডো

1
@DoktorOSwaldo। আমার ধারণা এই সমাধানটি দীর্ঘ সময়ের জন্য কাজ করে - printf()যদিও না ভিম in এ তালিকাগুলি চালু হয়েছিল তবে আমাকে অবশ্যই স্বীকার করতে হবে যে আমি প্রত্যাশা করিনি (/ মনে নেই?) এর <bar>ক্ষেত্রের অন্তর্গত :global- আইওডাব্লু, আমি যে দৃশ্যের প্রত্যাশা করেছিলাম তা হ'ল :subম্যাচিং লাইনে প্রয়োগ করা , তারপরে iএকেবারে শেষে। আমি আশা করি এই সমাধানটি কিছুটা ধীর হবে। কিন্তু এটা আসলে ব্যাপার? গুরুত্বপূর্ণ বিষয় হ'ল আমরা মেমরি + ট্রায়াল এবং ত্রুটি থেকে কত সহজে সমাধানের সমাধান করতে সক্ষম হয়েছি with উদাহরণস্বরূপ, ভিমগল্ফাররা ম্যাক্রোগুলি পছন্দ করে।
লুক হার্মিটে

1
@ লুচিরমিট হ্যাঁ আমি একই প্রতিপন্ন করেছি এবং গতির কোনও ব্যাপার নেই doesn't আমি মনে করি এটি একটি ভাল উত্তর, এবং আমি আবার এটি থেকে কিছু শিখেছি। হয়তো g/s//স্কোপ আচরণটি অন্যান্য নোংরা কৌশলগুলির জন্য অনুমতি দেয়। তাই আকর্ষণীয় উত্তর এবং আলোচনার জন্য আপনাকে উভয়কেই ধন্যবাদ, আমি প্রায়শই উত্তর দেওয়া থেকে তেমনটি শিখি না))।
ডক্টর ওসওয়াল্ডো

4

এই পৃষ্ঠায় ইতিমধ্যে তিনটি দুর্দান্ত উত্তর রয়েছে, তবে লুস হার্মিটে যেমন একটি মন্তব্যে বলেছিলেন যে আপনি যদি এই অফ-দ্য কফটি করছেন তবে গুরুত্বপূর্ণ বিষয়টি হল আপনি কতটা দ্রুত এবং সহজেই একটি কার্যকর সমাধান সমাধান করতে পারবেন upon

যেমনটি, এটি এমন একটি সমস্যা যা আমি আসলে ব্যবহার করি না :substitute: এটি এমন একটি যা নিয়মিত সাধারণ মোড কমান্ড এবং পুনরাবৃত্ত ম্যাক্রো ব্যবহার করে সহজেই সমাধান করা যায়:

  1. (যদি প্রয়োজন হয়) প্রথমে বন্ধ করুন 'wrapscan'। আমরা যে নিয়মিত এক্সপ্রেশনটি ব্যবহার করতে যাচ্ছি তা পছন্দসই ফলাফলের পাঠ্যের পাশাপাশি প্রাথমিক পাঠ্যের সাথে 'wrapscan'মিলবে , সুতরাং এর সাথে , ম্যাক্রো অন্যথায় চিরতরে খেলতে থাকবে। (অথবা যতক্ষণ না বুঝতে পারছেন কী হচ্ছে এবং টিপুন <C-C>)):

    :set nowrapscan
    
  2. আপনার অনুসন্ধান শব্দটি সেট আপ করুন (বিদ্যমান উত্তরগুলিতে ইতিমধ্যে উল্লিখিত একই বেস নিয়মিত অভিব্যক্তিটি ব্যবহার করে):

    /#\d\+\(\.\d\+\)\?<CR>
    
  3. (প্রয়োজনে) প্রয়োজনমতোবার টিপে প্রথম ম্যাচে ফিরে যান N,

  4. (প্রয়োজনে) প্রথম ম্যাচটি পছন্দসই লেখায় পরিবর্তন করুন:

    cE#1<Esc> 
    
  5. নিবন্ধটি সাফ করুন "qএবং ম্যাক্রো রেকর্ডিং শুরু করুন:

    qqqqq
    
  6. ইয়াঙ্ক বর্তমান কাউন্টার:

    yiW
    
  7. পরের ম্যাচে ঝাঁপ দাও:

    n
    
  8. আমরা কেবল ইয়েঙ্কড দিয়ে বর্তমান কাউন্টারটি প্রতিস্থাপন করুন:

    vEp
    
  9. কাউন্টার বৃদ্ধি:

    <C-A>
    
  10. ম্যাক্রো খেলুন q। নিবন্ধটি "qএখনও খালি আছে কারণ আমরা এটিকে 5 তম ধাপে সাফ করে দিয়েছি, সুতরাং এই মুহুর্তে কিছুই ঘটে না:

    @q
    
  11. ম্যাক্রো রেকর্ডিং বন্ধ করুন:

    q
    
  12. নতুন ম্যাক্রো খেলুন, এবং দেখুন!

    @q
    

সমস্ত ম্যাক্রোগুলির মতোই, আমি উপরে বর্ণিত হিসাবে ব্যাখ্যা করার সময় অনেকগুলি ধাপের মতো দেখায়, তবে মনে রাখবেন যে এগুলিতে টাইপ করা আমার পক্ষে খুব দ্রুত: পুনরাবৃত্ত-ম্যাক্রো-রেকর্ডিং-বয়লারপ্লেটগুলি বাদ দিয়ে তারা কেবলমাত্র নিয়মিত're সম্পাদনা কমান্ডগুলি আমি সম্পাদনার সময় সমস্ত সময় সম্পাদন করছি। চিন্তাভাবনার কাছে যাওয়ার জন্য আমাকে কিছু করতে হয়েছিল এমন একমাত্র পদক্ষেপটি ছিল পদক্ষেপ 2, যেখানে আমি অনুসন্ধানটি চালানোর জন্য নিয়মিত প্রকাশটি লিখেছিলাম।

দুটি কমান্ড-লাইন মোড কমান্ড এবং একটি কী-স্ট্রোকের সিরিজ হিসাবে ফর্ম্যাট করা হয়েছে, এই ধরণের সমাধানের গতি আরও স্পষ্ট হয়ে ওঠে: আমি নিম্নলিখিতটি যতটা দ্রুত টাইপ করতে পারি ততই দ্রুত জঞ্জাল করতে পারি : 1

:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q

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

1: আছে আছে পরিস্থিতিতে যেখানে ম্যাক্রো আরো চিন্তার প্রয়োজন কিন্তু আমি মনে করি তারা বাস্তবে অনেক আপ আসে না খুঁজে। এবং সাধারণত যে পরিস্থিতিগুলি ঘটে সেগুলি হ'ল ম্যাক্রোই একমাত্র ব্যবহারিক সমাধান।

2: অন্য উত্তরদাতাদের একই সমাধান সহজেই করা সম্ভব ছিল না তা বোঝানোর জন্য নয়: তাদের কেবল দক্ষতা / জ্ঞান প্রয়োজন যা আমি ব্যক্তিগতভাবে আমার নখদর্পণে এত সহজে পাই না don't তবে সমস্ত ভিম ব্যবহারকারীরা নিয়মিত সম্পাদনা আদেশগুলি কীভাবে ব্যবহার করতে হয় তা জানেন!


1

কেবল শেষে '#' যোগ করুন একটি কাউন্টার 'সি'

:let c=0 | g/^#\d\+.*/ let c+=1 | s//\='#' . c

গ্লোবাল অংশটি কেবল g/^#\d\+.*/ let c+=1আমাদের প্যাটার্নগুলিতে কেবল সেই লাইনে কাউন্টারকে বাড়িয়ে তোলার অনুমতি দেয়


হিপ্পিট্রেইলের উত্তরের উত্তরটি কী তা নয়?
ডি বেন নোবল

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