আইএফএস (অভ্যন্তরীণ ক্ষেত্র বিভাজক) একাধিক টানা ডিলিমিটার চরগুলির জন্য একক বিভাজক হিসাবে কাজ করতে পারে?


10

অ-হোয়াইট স্পেস মানগুলির সাথে আইএফএস ব্যবহার করে একটি অ্যারে পার্স করা খালি উপাদান তৈরি করে।
এমনকি tr -sএকটি একক ডিলিমের জন্য একাধিক সীমানা সঙ্কুচিত করতে ব্যবহার করাও যথেষ্ট নয়।
একটি উদাহরণ ইস্যুটিকে আরও স্পষ্টভাবে ব্যাখ্যা করতে পারে ..
আইএফএসের একটি টুইটের মাধ্যমে "স্বাভাবিক" ফলাফল অর্জনের কোনও উপায় আছে (আইএফএসের আচরণ পরিবর্তনের জন্য কি কোনও সম্পর্কযুক্ত सेटिंग রয়েছে? .... অর্থাৎ ডিফল্ট হোয়াইটস্পেসের মতো একই কাজ করা) IFS।

var=" abc  def   ghi    "
echo "============== IFS=<default>"
arr=($var)
for x in ${!arr[*]} ; do
   echo "# arr[$x] \"${arr[x]}\""
done
#
sfi="$IFS" ; IFS=':'
set -f # Disable file name generation (globbing)
       # (This  data won't "glob", but unless globbing     
       #  is actually needed, turn if off, because   
       #  unusual/unexpected combinations of data can glob!
       #  and they can do it in the most obscure ways...  
       #  With IFS, "you're not in Kansas any more! :)  
var=":abc::def:::ghi::::"
echo "============== IFS=$IFS"
arr=($var)
for x in ${!arr[*]} ; do
   echo "# arr[$x] \"${arr[x]}\""
done
echo "============== IFS=$IFS and tr"
arr=($(echo -n "$var"|tr -s "$IFS"))
for x in ${!arr[*]} ; do
   echo "# arr[$x] \"${arr[x]}\""
done
set +f     # enable globbing 
IFS="$sfi" # re-instate original IFS val
echo "============== IFS=<default>"

এখানে আউটপুট


============== IFS=<default>
# arr[0] "abc"
# arr[1] "def"
# arr[2] "ghi"
============== IFS=:
# arr[0] ""
# arr[1] "abc"
# arr[2] ""
# arr[3] "def"
# arr[4] ""
# arr[5] ""
# arr[6] "ghi"
# arr[7] ""
# arr[8] ""
# arr[9] ""
============== IFS=: and tr
# arr[0] ""
# arr[1] "abc"
# arr[2] "def"
# arr[3] "ghi"
============== IFS=<default>

একই প্রশ্নের আরও ভাল (আমার মনে হয়) উত্তর আছে : stackoverflow.com/a/14789518/1765658
এফ হৌরি

উত্তর:


3

একাধিক (স্পেসহীন) ক্রমাগত ডিলিমিটার চরগুলি অপসারণ করতে দুটি (স্ট্রিং / অ্যারে) প্যারামিটার বিস্তৃতি ব্যবহার করা যেতে পারে। কৌশলটি হ'ল IFSঅ্যারে প্যারামিটার বিস্তারের জন্য ভেরিয়েবলটি খালি স্ট্রিংয়ে সেট করা ।

ওয়ার্ড বিভক্তকরণেরman bash অধীনে এটি নথিভুক্ত করা হয়েছে :

অমূল্য নিখুঁত নাল আর্গুমেন্টগুলি, যার কোনও মান নেই এমন পরামিতিগুলির প্রসারণের ফলে মুছে ফেলা হবে।

(
set -f
str=':abc::def:::ghi::::'
IFS=':'
arr=(${str})
IFS=""
arr=(${arr[@]})

echo ${!arr[*]}

for ((i=0; i < ${#arr[@]}; i++)); do 
   echo "${i}: '${arr[${i}]}'"
done
)

ভাল! একটি সহজ এবং কার্যকর পদ্ধতি - কোনও ব্যাশ লুপের প্রয়োজন নেই এবং কোনও ইউটিলিটি অ্যাপ - বিটিডাব্লু কল করার প্রয়োজন নেই। যেমন আপনি "(অ-স্থান)" উল্লেখ করেছেন , আমি স্পষ্টতার জন্য উল্লেখ করেছিলাম যে এটি স্থান সহ ডিলিমিটার চরগুলির যে কোনও সংমিশ্রণে ভাল কাজ করে।
পিটার.ও

আমার পরীক্ষাগুলিতে সেটিং IFS=' '(অর্থাত্ একটি সাদা স্থান) একই আচরণ করে। আমি এটির একটি স্পষ্ট নাল আর্গুমেন্ট ("" বা '') এর চেয়ে কম বিভ্রান্তিকর বলে মনে করি IFS
মিশা উইডেনম্যান

যদি আপনার ডেটাতে এম্বেড করা শ্বেত স্থান থাকে তবে এটি একটি ভয়াবহ সমাধান। এটি, যদি আপনার ডেটা 'এবিসি' এর পরিবর্তে 'বিসি' হয়, আইএফএস = "" 'বিসি' থেকে আলাদা উপাদানগুলিতে 'এ' বিভক্ত হবে।
দেজয় ক্লেটন

5

bashম্যানপেজ থেকে :

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

এর অর্থ হ'ল আইএফএস হোয়াইটস্পেস (স্পেস, ট্যাব এবং নিউলাইন) অন্যান্য বিভাজকের মতো আচরণ করা হয় না। আপনি যদি বিকল্প বিভাজকের সাথে ঠিক একই আচরণ পেতে চান তবে আপনি trবা এর সাহায্যে কিছু বিভাজক অদলবদল করতে পারেন sed:

var=":abc::def:::ghi::::"
arr=($(echo -n $var | sed 's/ /%#%#%#%#%/g;s/:/ /g'))
for x in ${!arr[*]} ; do
   el=$(echo -n $arr | sed 's/%#%#%#%#%/ /g')
   echo "# arr[$x] \"$el\""
done

%#%#%#%#%জিনিস ক্ষেত্র ভিতরে সম্ভব স্পেস প্রতিস্থাপন করতে একটি যাদু মান করে তা "অনন্য" (অথবা খুব unlinkely) হতে আশা করা হচ্ছে। আপনি যদি নিশ্চিত হন যে কোনও জায়গাতেই কখনও ক্ষেত্র থাকবে না, কেবল এই অংশটি ফেলে দিন)।


@ ফাসিএস ... ধন্যবাদ (আমার প্রশ্নের মোডিফিক্যাটনটি দেখুন) ... আপনি হয়ত আমার উদ্দেশ্যযুক্ত প্রশ্নের উত্তর দিয়েছেন .. এবং সেই উত্তরটি হতে পারে (সম্ভবত এটি) "আইএফএসের সাথে আচরণ করার কোনও উপায় নেই আমি যে পদ্ধতিতে চাই "... trসমস্যাগুলি দেখানোর জন্য উদাহরণগুলি উদ্দিষ্ট করি ... আমি একটি সিস্টেম কল এড়াতে চাই, তাই আমি ${var##:}গ্লেনস অ্যানভেয়ারে আমার মন্তব্যে উল্লিখিত একটি বাশ অপশনের দিকে নজর দেব .... আমি একটি সময়ের জন্য অপেক্ষা করবো .. সম্ভবত
আইএফএসের কোটেক্স

IFSবোর্ন-স্টাইলের সমস্ত শেলের মধ্যে সেই চিকিত্সা একই, এটি পসিক্সে নির্দিষ্ট করা আছে
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

4-প্লাস বছর পরে আমি এই প্রশ্নটি জিজ্ঞাসা করেছি - আমি @ নাজাদের উত্তর খুঁজে পেয়েছি (এক বছর আগে পোস্ট করা) আইএফএসের জালগল করার সবচেয়ে সহজ উপায় যেকোন সংখ্যা এবং IFSঅক্ষরের সংমিশ্রণকে ডিলিমিটার-স্ট্রিং হিসাবে তৈরি করতে আইএফএসকে জাগল করার সহজ উপায় । আমার প্রশ্নের উত্তরটি সর্বোত্তমভাবে দেওয়া হয়েছিল jon_d, তবে @ নাজাদের উত্তরটি IFSকোনও লুপ এবং কোনও ইউটিলিটি অ্যাপ্লিকেশন না দিয়ে ব্যবহার করার এক নিফ্ট উপায় দেখায় ।
পিটার.ও

2

যেহেতু বাশ আইএফএস একক ডিলিমিটার হিসাবে একটানা ডিলিমিটার অক্ষরগুলি ব্যবহারের জন্য অভ্যন্তরীণ উপায় সরবরাহ করে না (শ্বেতক্ষেত্রের সীমানা নির্ধারণকারীদের জন্য), আমি একটি সমস্ত ব্যাশ সংস্করণ (বনাম। একটি বহিরাগত কল যেমন বনাম ব্যবহার করে। Tr, awk, সেড) রেখেছি )

এটি মাল্টি-চর আইএফএস পরিচালনা করতে পারে ..

এই কিউ / এ পৃষ্ঠায় প্রদর্শিত trawkবিকল্পগুলির জন্য একই ধরণের পরীক্ষার পাশাপাশি এখানে এর কার্যকরকরণের সময়সূচি; টিএস ... এই পরীক্ষাগুলি কেবল অ্যারে তৈরির 10000 বিভক্তির উপর ভিত্তি করে (কোনও আই / ও নেই) ...

pure bash     3.174s (28 char IFS)
call (awk) 0m32.210s  (1 char IFS) 
call (tr)  0m32.178s  (1 char IFS) 

এখানে আউটপুট

# dlm_str  = :.~!@#$%^&()_+-=`}{][ ";></,
# original = :abc:.. def:.~!@#$%^&()_+-=`}{][ ";></,'single*quote?'..123:
# unified  = :abc::::def::::::::::::::::::::::::::::'single*quote?'::123:
# max-w 2^ = ::::::::::::::::
# shrunk.. = :abc:def:'single*quote?':123:
# arr[0] "abc"
# arr[1] "def"
# arr[2] "'single*quote?'"
# arr[3] "123"

এখানে স্ক্রিপ্ট

#!/bin/bash

# Note: This script modifies the source string. 
#       so work with a copy, if you need the original. 
# also: Use the name varG (Global) it's required by 'shrink_repeat_chars'
#
# NOTE: * asterisk      in IFS causes a regex(?) issue,     but  *  is ok in data. 
# NOTE: ? Question-mark in IFS causes a regex(?) issue,     but  ?  is ok in data. 
# NOTE: 0..9 digits     in IFS causes empty/wacky elements, but they're ok in data.
# NOTE: ' single quote  in IFS; don't know yet,             but  '  is ok in data.
# 
function shrink_repeat_chars () # A 'tr -s' analog
{
  # Shrink repeating occurrences of char
  #
  # $1: A string of delimiters which when consecutively repeated and are       
  #     considered as a shrinkable group. A example is: "   " whitespace delimiter.
  #
  # $varG  A global var which contains the string to be "shrunk".
  #
# echo "# dlm_str  = $1" 
# echo "# original = $varG" 
  dlms="$1"        # arg delimiter string
  dlm1=${dlms:0:1} # 1st delimiter char  
  dlmw=$dlm1       # work delimiter  
  # More than one delimiter char
  # ============================
  # When a delimiter contains more than one char.. ie (different byte` values),    
  # make all delimiter-chars in string $varG the same as the 1st delimiter char.
  ix=1;xx=${#dlms}; 
  while ((ix<xx)) ; do # Where more than one delim char, make all the same in varG  
    varG="${varG//${dlms:$ix:1}/$dlm1}"
    ix=$((ix+1))
  done
# echo "# unified  = $varG" 
  #
  # Binary shrink
  # =============
  # Find the longest required "power of 2' group needed for a binary shrink
  while [[ "$varG" =~ .*$dlmw$dlmw.* ]] ; do dlmw=$dlmw$dlmw; done # double its length
# echo "# max-w 2^ = $dlmw"
  #
  # Shrik groups of delims to a single char
  while [[ ! "$dlmw" == "$dlm1" ]] ; do
    varG=${varG//${dlmw}$dlm1/$dlm1}
    dlmw=${dlmw:$((${#dlmw}/2))}
  done
  varG=${varG//${dlmw}$dlm1/$dlm1}
# echo "# shrunk.. = $varG"
}

# Main
  varG=':abc:.. def:.~!@#$%^&()_+-=`}{][ ";></,'\''single*quote?'\''..123:' 
  sfi="$IFS"; IFS=':.~!@#$%^&()_+-=`}{][ ";></,' # save original IFS and set new multi-char IFS
  set -f                                         # disable globbing
  shrink_repeat_chars "$IFS" # The source string name must be $varG
  arr=(${varG:1})    # Strip leading dlim;  A single trailing dlim is ok (strangely
  for ix in ${!arr[*]} ; do  # Dump the array
     echo "# arr[$ix] \"${arr[ix]}\""
  done
  set +f     # re-enable globbing   
  IFS="$sfi" # re-instate the original IFS
  #
exit

দুর্দান্ত কাজ, আকর্ষণীয় +1!
এফ। হাউরি

1

আপনি গাওক দিয়ে এটিও করতে পারেন, তবে এটি সুন্দর নয়:

var=":abc::def:::ghi::::"
out=$( gawk -F ':+' '
  {
    # strip delimiters from the ends of the line
    sub("^"FS,"")
    sub(FS"$","")
    # then output in a bash-friendly format
    for (i=1;i<=NF;i++) printf("\"%s\" ", $i)
    print ""
  }
' <<< "$var" )
eval arr=($out)
for x in ${!arr[*]} ; do
  echo "# arr[$x] \"${arr[x]}\""
done

আউটপুট

# arr[0] "abc"
# arr[1] "def"
# arr[2] "ghi"

ধন্যবাদ ... আমি আমার প্রধান অনুরোধে (পরিমার্জিত প্রশ্ন) পরিষ্কার হয়েছি বলে মনে হচ্ছে না ... এটি কেবলমাত্র আমার $varকাছে পরিবর্তন করে করা যথেষ্ট ${var##:}... আমি নিজেই আইএফএসকে টুইট করার উপায়ের পরে এসেছি .. আমি চাই বাহ্যিক কল ছাড়াই এটি করার জন্য (আমার মনে হচ্ছে যে কোনও বাহ্যিকের চেয়ে ব্যাশ আরও কার্যকরভাবে এটি করতে পারে .. সুতরাং আমি সেই ট্র্যাকটি চালিয়ে যাব) ... আপনার পদ্ধতিটি কাজ করে (+1) .... এ পর্যন্ত ইনপুটটি পরিবর্তন করার সাথে সাথে আমি বাজ দিয়ে চেষ্টা করতে পছন্দ করবো, বরং আঁশ বা ট্রির চেয়ে বরং (এটি কোনও সিস্টেম কল এড়াতে পারে), তবে আমি সত্যিই একটি
আইএফএসের টুইটের জন্য অপেক্ষা করছিলাম

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

@্লেইন .. (আপনি বলেছিলেন যে আপনার উত্তরটি "সুন্দর" নয়) আমার মনে হয় এটি হ'ল! :) তবে, আমি একটি সমস্ত বাশ সংস্করণ (বনাম একটি বাহ্যিক কল) একসাথে রেখেছি এবং কেবল অ্যারে তৈরির 10000 এর উপর ভিত্তি করে ( না I / O) ... bash 1.276s... call (awk) 0m32.210s,,, call (tr) 0m32.178s... কয়েকবার এটি করুন এবং আপনি ভাবেন যে বাশ খুব ধীর! ... এক্ষেত্রে কি আরও সহজ? ... না যদি আপনি ইতিমধ্যে স্নিপেট পেয়েছেন :) ... আমি পরে এটি পোস্ট করব; এখন যেতে হবে.
পিটার.ও

যাইহোক, আপনার গাক স্ক্রিপ্টটি আবার ... আমি মূলত এর আগে বিশ্রী ব্যবহার করিনি, তাই আমি এটির (এবং অন্যদের) বিস্তারিতভাবে দেখছি ... কেন আমি বেছে নিতে পারছি না, তবে আমি উল্লেখ করব যাইহোক সমস্যাটি .. .. যখন উদ্ধৃত তথ্য দেওয়া হয় তখন তা উদ্ধৃতিগুলি হ্রাস করে এবং কোটগুলির মধ্যে ফাঁকা স্থানগুলিতে বিভক্ত হয় .. এবং var="The \"X\" factor:::A single '\"' crashes:::\"One Two\""
বিশিষ্ট

-1

সরল উত্তরটি হ'ল: সমস্ত প্রেরককে একজনকে (প্রথমটিতে) ভেঙে দিন।
এর জন্য একটি লুপ প্রয়োজন (যা কম রান করে)log(N) সময়ের ):

 var=':a bc::d ef:#$%_+$$%      ^%&*(*&*^
 $#,.::ghi::*::'                           # a long test string.
 d=':@!#$%^&*()_+,.'                       # delimiter set
 f=${d:0:1}                                # first delimiter
 v=${var//["$d"]/"$f"};                    # convert all delimiters to
 :                                         # the first of the delimiter set.
 tmp=$v                                    # temporal variable (v).
 while
     tmp=${tmp//["$f"]["$f"]/"$f"};        # collapse each two delimiters to one
     [[ "$tmp" != "$v" ]];                 # If there was a change
 do
     v=$tmp;                               # actualize the value of the string.
 done

যা করার বাকি তা হ'ল একটিতে স্ট্রিংটি সঠিকভাবে বিভক্ত করা ডিলিমিটারের এবং এটি মুদ্রণ:

 readarray -td "$f" arr < <(printf '%s%s' "$v"'' "$f")
 printf '<%s>' "${arr[@]}" ; echo

set -fআইএফএসের পরিবর্তন বা পরিবর্তন করার দরকার নেই ।
শূন্যস্থান, নিউলাইন এবং গ্লোব অক্ষরের সাথে পরীক্ষিত। সব কাজ. বেশ ধীর (যেমন শেল লুপ হওয়ার আশা করা উচিত)।
তবে কেবল বাশের জন্য (ব্যাটার 4.4 -d++ রিডারারের বিকল্পের কারণে )।


SH

শেল সংস্করণ কোনও অ্যারে ব্যবহার করতে পারে না, কেবলমাত্র অ্যারে উপলব্ধ অবস্থানীয় পরামিতি।
ব্যবহার tr -sকরা মাত্র একটি লাইন (আইএফএস স্ক্রিপ্টে পরিবর্তন হয় না):

 set -f; IFS=$f command eval set -- '$(echo "$var" | tr -s "$d" "[$f*]" )""'

এবং এটি মুদ্রণ:

 printf '<%s>' "$@" ; echo

এখনও ধীর, তবে বেশি কিছু নয়।

commandবোর্নে কমান্ডটি অবৈধ।
Zsh এ, commandকেবলমাত্র বাহ্যিক কমান্ড কল করে এবং যদি commandব্যবহার করা হয় তবে বিফলকে ব্যর্থ করে তোলে ।
Ksh সালে, এমনকি, আইএফএসের commandমান বিশ্বব্যাপী সুযোগে পরিবর্তিত হয়।
এবং commandবিভাজনকে ম্যাক্স সম্পর্কিত শেলগুলিতে ব্যর্থ করে তোলে (এমএক্সএস, লাক্স, পশ) কমান্ড অপসারণ করা commandকোডটি আরও শেলগুলিতে চালিত করে। তবে: commandঅপসারণটি আইএফএসকে বেশিরভাগ শেলের (ইওাল একটি বিশেষ অন্তর্নির্মিত) ব্য্যাশ (পসিক্স মোড ব্যতীত) এবং ডিফল্টে (কোনও এমুলেশন নয়) মোড ব্যতীত এর মান ধরে রাখতে সক্ষম করে। এই ধারণাটি ডিফল্ট zsh এ কাজ করে বা ছাড়া করা যায় না command


একাধিক অক্ষর আইএফএস

হ্যাঁ, আইএফএস একাধিক চরিত্রের হতে পারে তবে প্রতিটি চরিত্রই একটি যুক্তি তৈরি করবে:

 set -f; IFS="$d" command eval set -- '$(echo "$var" )""'
 printf '<%s>' "$@" ; echo

আউটপুট দেবে:

 <><a bc><><d ef><><><><><><><><><      ><><><><><><><><><
 ><><><><><><ghi><><><><><>

বাশ সহ, আপনি commandশব্দটি sh / POSIX অনুকরণে না থাকলে বাদ দিতে পারেন। কমান্ডটি ksh93 এ ব্যর্থ হবে (আইএফএস পরিবর্তিত মান রাখে)। Zsh এ কমান্ড commandzsh সন্ধান করার চেষ্টা করেeval কে বাহ্যিক কমান্ড হিসাবে (যা এটি খুঁজে পায় না) এবং ব্যর্থ হয়।

যা ঘটে তা হ'ল কেবলমাত্র আইএফএস অক্ষর যা একটি ডিলিমিটারে স্বয়ংক্রিয়ভাবে পতিত হয় সেগুলি হ'ল আইএফএস সাদা স্থান।
আইএফএসের একটি স্পেস ক্রমাগত সমস্ত স্থানকে এক জায়গায় নামিয়ে ফেলবে। একটি ট্যাব সমস্ত ট্যাব ধসে যাবে। একটি স্থান এবং একটি ট্যাব ফাঁকা জায়গা এবং / অথবা ট্যাবগুলিকে একটি ডিলিমিটারে ভেঙে দেবে। নিউলাইন দিয়ে ধারণাটি পুনরাবৃত্তি করুন।

বেশ কয়েকটি ডিলিমিটরকে ভেঙে ফেলার জন্য কিছু জাগ্রত করা প্রয়োজন।
ধরে নিই ASCII 3 (0x03) ইনপুটটিতে ব্যবহৃত হয় না var:

 var=${var// /$'\3'}                       # protect spaces
 var=${var//["$d"]/ }                      # convert all delimiters to spaces
 set -f;                                   # avoid expanding globs.
 IFS=" " command eval set -- '""$var""'    # split on spaces.
 set -- "${@//$'\3'/ }"                    # convert spaces back.

Ksh, zsh এবং bash (প্রায় সম্পর্কে) বেশিরভাগ মন্তব্য command এবং আইএফএস) এখনও এখানে প্রয়োগ হয়।

$'\0'পাঠ্য ইনপুটটিতে একটি মান কম সম্ভাব্য হবে তবে ব্যাশ ভেরিয়েবলগুলিতে NULs ( 0x00) থাকতে পারে না ।

একই স্ট্রিং ক্রিয়াকলাপ করার জন্য sh এ কোনও অভ্যন্তরীণ কমান্ড নেই, তাই sh স্ক্রিপ্টগুলির জন্য টিআর একমাত্র সমাধান।


হ্যাঁ, আমি লিখেছিলাম যে শেলটির জন্য ওপি চেয়েছিল: বাশ। সেই শেলটিতে আইএফএস রাখা হয় না। এবং হ্যাঁ, উদাহরণস্বরূপ zsh, বহনযোগ্য নয়। @ স্টাফেনচাজেলাস
আইজাক

বাশ এবং zsh এর ক্ষেত্রে, তারা POSIX হিসাবে চিহ্নিত হয় যখন sh হিসাবে আহ্বান জানানো হয়
স্টাফেন চ্যাজেলাস

@ স্টাফেনচাজলাস প্রতিটি শেলের সীমাবদ্ধতা সম্পর্কে নোট যুক্ত করেছেন (বহু)।
ইসহাক

@ স্টাফেনচাজেলাস কেন ডাউনটা?
ইসহাক

জানিনা, আমি ছিলাম না। বিটিডাব্লু, আমার মনে command evalহয় গিলস দ্বারা আইআইআরসি সম্পর্কে এখানে একটি উত্সর্গীকৃত প্রশ্নোত্তর রয়েছে
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.