অন্যান্য উত্তরগুলি এই প্রশ্নের দুটি প্রধান দিকগুলির একটিকে সম্বোধন করেছে: আপনার প্রয়োজনীয় নামকরণের অপারেশন সফলভাবে কীভাবে সম্পাদন করা যায়। এই উত্তরের উদ্দেশ্য হ'ল কমান্ডের প্রসঙ্গে তত্ক্ষণাতীত "বেয়ারওয়ার্ড অনুমোদিত নয়" ত্রুটি বার্তার অর্থ সহ আপনার আদেশগুলি কেন কাজ করে না তা ব্যাখ্যা করা rename।
এই উত্তরের প্রথম বিভাগটি renameপার্ল এবং পার্লের মধ্যে সম্পর্ক সম্পর্কে এবং renameআপনি এটি যে প্রথম কমান্ড-লাইন আর্গুমেন্ট ব্যবহার করেন সেটি কীভাবে ব্যবহার করে তা এটি তার কোড আর্গুমেন্ট। দ্বিতীয় বিভাগটি কীভাবে শেলটি সম্প্রসারণ সম্পাদন করে - বিশেষত গ্লোববিং - একটি যুক্তি তালিকা তৈরি করতে। তৃতীয় বিভাগটি পার্ল কোডে কী চলছে যা সম্পর্কে "বেরওয়ারওয়ার্ড অনুমোদিত নয়" ত্রুটি দেয় about অবশেষে, চতুর্থ বিভাগটি কমান্ডটি প্রবেশ করানো এবং ত্রুটি পাওয়ার মধ্যে ঘটে যাওয়া সমস্ত পদক্ষেপের সংক্ষিপ্তসার।
1. আপনাকে যখন renameঅদ্ভুত ত্রুটি বার্তা দেয় তখন আপনার অনুসন্ধানে "পার্ল" যুক্ত করুন।
ডেবিয়ান এবং উবুন্টুতে, renameকমান্ডটি পার্ল স্ক্রিপ্ট যা ফাইলটির নাম পরিবর্তন করে। পুরানো প্রকাশে - 14.04 এলটিএস সহ, যা এখনও এই লেখার মতো সমর্থনযোগ্য - এটি একটি প্রতীকী লিঙ্ক ছিল যা কমান্ডের ( পরোক্ষভাবে ) নির্দেশিত হয়েছিল prename। নতুন রিলিজে এটি নতুন file-renameকমান্ডের পরিবর্তে নির্দেশ করে points এই দুটি পার্ল নাম বদলে দেওয়া আদেশগুলি বেশিরভাগ একইভাবে কাজ করে এবং আমি renameএই উত্তরটির বাকী হিসাবে কেবল তাদের উভয়কেই উল্লেখ করব ।
আপনি যখন renameকমান্ডটি ব্যবহার করেন , আপনি কেবল অন্য কারও লেখা পার্ল কোড চালাচ্ছেন না। আপনি নিজের পার্ল কোডও লিখেছেন এবং renameচালানোর জন্য বলছেন । এ কারণে যে প্রথম কম্যান্ড-লাইন যুক্তি আপনাকে পাস renameকমান্ড ছাড়া অন্য বিকল্প আর্গুমেন্ট মত -n, প্রকৃত পার্ল কোড নিয়ে গঠিত । renameকমান্ড প্রতিটি কাজ করার জন্য এই কোড ব্যবহার pathnames হবে যা পরবর্তীবার কমান্ড লাইন আর্গুমেন্ট যেমন পাস। (আপনি যদি কোনও পথের যুক্তিগুলি পাস না করেন তবে তার পরিবর্তে স্ট্যান্ডার্ড ইনপুটrename থেকে পাথের নামগুলি পড়বে , প্রতি লাইনে একটি)
কোডটি একটি লুপের অভ্যন্তরে চালিত হয় , যা প্রতি নাম অনুসারে একবারে পুনরাবৃত্তি করে । লুপের প্রতিটি পুনরাবৃত্তির শীর্ষে, আপনার কোডটি চালানোর আগে, বিশেষ $_চলকটি বর্তমানে প্রক্রিয়াধীন পাথের নামটি বরাদ্দ করা হয়। যদি আপনার কোডটির মান $_অন্য কোনও কিছুর কাছে পরিবর্তিত হয়, তবে সেই ফাইলটির নতুন নামকরণ করে নতুন নামকরণ করা হবে।
পার্লের অনেকগুলি এক্সপ্রেশন$_ ভেরিয়েবলের উপর স্পষ্টভাবে পরিচালিত হয় যখন তাদের অপারেন্ড হিসাবে ব্যবহার করার জন্য অন্য কোনও অভিব্যক্তি দেওয়া হয় না । উদাহরণস্বরূপ, প্রতিকল্পন অভিব্যক্তি $str =~ s/foo/bar/প্রথম সংঘটন পরিবর্তন fooস্ট্রিং-এর দ্বারা অনুষ্ঠিত $str পরিবর্তনশীল করতে bar, অথবা পাতার আপাতত অপরিবর্তিত এটা ধারণ করে না যদি foo। আপনি যদি কেবল অপারেটরটিs/foo/bar/ স্পষ্টভাবে না ব্যবহার করে=~ লিখেন তবে এটি চালিত হয় $_। এটি যে s/foo/bar/জন্য সংক্ষিপ্ত বলা হয় $_ =~ s/foo/bar/।
এটা তোলে পাস সাধারণ একটি s///অভিব্যক্তি থেকে renameকোড যুক্তি (অর্থাত, প্রথম কম্যান্ড-লাইন যুক্তি) হিসাবে, কিন্তু আপনি করতে হবে না। লুপের অভ্যন্তরে চলার জন্য আপনি যে কোনও পার্ল কোড চান তা দিতে পারেন, এর প্রতিটি মান পরীক্ষা করতে $_এবং (শর্তাধীন) এটি সংশোধন করতে পারেন।
এটির প্রচুর শীতল এবং কার্যকর পরিণতি রয়েছে তবে তাদের বেশিরভাগেরই এই প্রশ্নোত্তর এবং উত্তরের ক্ষেত্রের বাইরে। আমি এটিকে এখানে আনার মূল কারণ - প্রকৃতপক্ষে, আমি এই উত্তরটি পোস্ট করার সিদ্ধান্ত নিয়েছিলাম - কারণটির প্রথম যুক্তিটি renameআসলে পার্ল কোড, যে কোনও সময় আপনি একটি অদ্ভুত ত্রুটির বার্তা পান এবং আপনি অনুসন্ধান করে এটি সম্পর্কে তথ্য পেতে সমস্যা হয়, আপনি অনুসন্ধানের স্ট্রিংয়ে "পার্ল" যুক্ত করতে পারেন (বা "পার্ল" এর সাথে "পুনরায় নামকরণ" প্রতিস্থাপন করতে পারেন, কখনও কখনও)) এবং আপনি প্রায়শই একটি উত্তর খুঁজে পাবেন।
2. সঙ্গে rename *.DAT *.dat, renameকমান্ড দেখেছি কখনো *.DAT!
কোনও কমান্ডের মতো প্রোগ্রামটি rename s/foo/bar/ *.txtসাধারণত *.txtকমান্ড-লাইন আর্গুমেন্ট হিসাবে প্রেরণ করে না এবং আপনি এটি চান না , যদি না আপনার কাছে এমন একটি ফাইল থাকে যার নাম অক্ষরে অক্ষরে থাকে , যা আশা করি আপনি না করেন।rename*.txt
renameব্যাখ্যা নেই উল্লিখিত glob নিদর্শন পছন্দ *.txt, *.DAT, *.dat, x*, *y, অথবা *যখন পথনাম আর্গুমেন্ট হিসাবে এটি পাস। পরিবর্তে, আপনার শেল তাদের উপর প্যাথনাম এক্সপেনশন সম্পাদন করে (এটিকে ফাইল নাম সম্প্রসারণও বলা হয়, এবং এটি গ্লোববিং নামেও পরিচিত)। renameইউটিলিটি চালানোর আগে এটি ঘটে । শেলটি গ্লোবগুলি সম্ভাব্য একাধিক পাথরনামে প্রসারিত করে এবং সেগুলি পৃথক কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করে rename। উবুন্টুতে, আপনার ইন্টারেক্টিভ শেলটি বাশ , যদি আপনি এটি পরিবর্তন না করেন তবে আমি উপরের বাশ রেফারেন্স ম্যানুয়ালটিতে লিঙ্ক করেছি ।
এমন একটি পরিস্থিতি রয়েছে যেখানে একটি গ্লোব প্যাটার্নটি একটি একক অপরিবর্তিত কমান্ড-লাইন যুক্তি হিসাবে দেওয়া যেতে পারে rename: যখন এটি কোনও ফাইলের সাথে মেলে না। বিভিন্ন শেল এই পরিস্থিতিতে বিভিন্ন ডিফল্ট আচরণ প্রদর্শন করে তবে বাশের ডিফল্ট আচরণটি হ'ল আক্ষরিক অর্থে বিশ্বব্যাপী পাস করা। তবে, আপনি খুব কমই এটি চান! যদি আপনি এটি চান না, তবে আপনার নিশ্চয়তা দেওয়া উচিত যে উদ্ধৃতিটি উদ্ধৃত করে না। এটি কোনও কমান্ডের কাছে আর্গুমেন্টগুলি পাস করার জন্য যায়, কেবল না rename।
উদ্ধৃতি কেবল গ্লোববিংয়ের জন্য নয় (ফাইলের নাম সম্প্রসারণ), কারণ আপনার শেলটি অব্যক্ত পাঠ্যে সম্পাদিত এমন আরও কিছু বিস্তৃতি রয়েছে এবং এর মধ্যে কিছু নয় তবে অন্যদের জন্যও " "উদ্ধৃতিতে আবদ্ধ পাঠ্য রয়েছে । সাধারণভাবে, যে কোন সময় আপনি একটি আর্গুমেন্ট যে অক্ষর আছে যা বিশেষভাবে ফাঁকা জায়গা সমেত শেল দ্বারা চিকিত্সা করা যেতে পারে ধারণ করে পাস, আপনি এটা উদ্ধৃত করা উচিত বাঞ্ছনীয় সাথে করতে চান ' 'কোট ।
পার্ল কোডে s/foo/bar/শেল দ্বারা বিশেষভাবে চিকিত্সা করা কোনও কিছুই থাকে না, তবে এটিরও উদ্ধৃত করা - এবং লেখা আমার পক্ষে ভাল ধারণা হত 's/foo/bar/'। (বস্তুত, একমাত্র কারণ আমি না যে এটি কিছু পাঠকদের জন্য বিভ্রান্তিকর হবে, আমি এখনো উদ্ধৃত বিষয়ে কথা বলত না ছিল।) সুতরাং আমি বলি এই ভাল হত কারণ এটি খুব সাধারণ যে পার্ল কোড আছে নেই ধারণ যেমন চরিত্রগুলি, এবং আমি যদি সেই কোডটি পরিবর্তন করতে পারি তবে উদ্ধৃতি দেওয়ার প্রয়োজন ছিল কিনা তা আমি মনে করতে পারি না। বিপরীতে, আপনি যদি শেলটি একটি গ্লোব প্রসারিত করতে চান তবে এটি উদ্ধৃত করা উচিত নয় ।
৩. পার্ল ইন্টারপ্রেটার অর্থ "খালি শব্দ অনুমোদিত নয়" এর অর্থ কী
আপনি আপনার প্রশ্নের যে ত্রুটি বার্তাগুলি দেখিয়েছেন তা প্রকাশ করে যে, যখন আপনি দৌড়েছিলেন rename *.DAT *.dat, তখন আপনার শেলটি *.DATএক বা একাধিক ফাইলের নামের তালিকায় প্রসারিত হয়েছিল এবং সেই ফাইলগুলির প্রথম নামটি ছিল b1.DAT। পরবর্তী সমস্ত আর্গুমেন্ট - অন্য যে কোনও উভয়ই যুক্তিটির পরে --came *.DATথেকে প্রসারিত এবং যে কোনও প্রসারিত হয়েছিল *.dat, সুতরাং তাদেরকে পথের নাম হিসাবে ব্যাখ্যা করা হত।
কারণ যা আসলে দৌড়েছিল তা কিছুটা হ'ল rename b1.DAT ...এবং কারণ এটি renameতার প্রথম অ-বিকল্প যুক্তিটিকে পার্ল কোড হিসাবে বিবেচনা করে, প্রশ্নটি b1.DATদাঁড়ায়: আপনি যখন পার্ল কোড হিসাবে চালনা করেন তখন এই "বেয়ারওয়ার্ড অনুমোদিত নয়" ত্রুটিগুলি কেন তৈরি করে ?
Bareword "b1" not allowed while "strict subs" in use at (user-supplied code).
Bareword "DAT" not allowed while "strict subs" in use at (user-supplied code).
শেল-এ, আমরা অজানা শেল বিস্তৃতি থেকে তাদের রক্ষা করতে আমাদের স্ট্রিংগুলি উদ্ধৃত করি যা অন্যথায় তাদের অন্য স্ট্রিংগুলিতে স্বয়ংক্রিয়ভাবে রূপান্তরিত করে (উপরের অংশটি দেখুন)। শেলগুলি হ'ল বিশেষ উদ্দেশ্যে প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি যা সাধারণ-উদ্দেশ্যমূলক ভাষাগুলি থেকে খুব আলাদাভাবে কাজ করে (এবং তাদের খুব অদ্ভুত বাক্য গঠন এবং শব্দার্থবিজ্ঞানগুলি এটি প্রতিফলিত করে)। তবে পার্ল একটি সাধারণ উদ্দেশ্যমূলক প্রোগ্রামিং ভাষা এবং বেশিরভাগ সাধারণ-উদ্দেশ্যমূলক প্রোগ্রামিং ভাষার মতো, পার্লে উদ্ধৃতি দেওয়ার মূল উদ্দেশ্যটি স্ট্রিংগুলি রক্ষা করা নয় , তবে সেগুলির উল্লেখ করা। এটি আসলে এমন একটি উপায় যা বেশিরভাগ প্রোগ্রামিং ভাষা প্রাকৃতিক ভাষার সাথে সমান। ইংরেজিতে এবং ধরুন আপনার কাছে একটি কুকুর আছে, "আপনার কুকুর" একটি দ্বি-শব্দ বাক্যাংশ, যখন আপনার কুকুর একটি কুকুর। একইভাবে, পার্লে, '$foo'একটি স্ট্রিং, যখন $fooএমন কিছু যাঁর নাম $foo।
যাইহোক, প্রায় প্রতি অন্যান্য সাধারণ প্রোগ্রামিং ভাষা অসদৃশ, পার্ল হবে এছাড়াও কখনও কখনও unquoted পাঠ্য হিসেবে ব্যাখ্যা করা উল্লেখ একটি স্ট্রিং, যাতে এটা হিসাবে "একই", অর্থে এটি একই অক্ষর দিয়ে তৈরি করা হয় - একটি স্ট্রিং একই আদেশ এটি কেবল কোডটি সেভাবে ব্যাখ্যা করার চেষ্টা করবে যদি এটি একটি খালি শব্দ হয় (না $বা অন্য সিগিল, নীচে দেখুন), এবং এটির পরে এটি দেওয়ার অন্য কোনও অর্থ খুঁজে না পেয়ে। তারপরে এটি স্ট্রিং হিসাবে নেবে, যদি না আপনি এটি সীমাবদ্ধতা সক্ষম করে না বলে থাকেন ।
পারলে ভেরিয়েবলগুলি সাধারণত সিগিল নামক একটি বিরামচিহ্ন দিয়ে শুরু হয় যা ভেরিয়েবলের বিস্তৃত প্রকারটি নির্দিষ্ট করে। উদাহরণস্বরূপ, $মানে স্কালে , @মানে অ্যারের , এবং %মানে হ্যাশ । ( অন্যদের আছে। ) চিন্তা যদি জানতে পারেন যে বিভ্রান্তিকর (অথবা বিরক্তিকর) না, কারণ আমি শুধুমাত্র বলতে এটা আনছি আপ যে একটি যখন বৈধ নাম একটি পার্ল প্রোগ্রাম দেখা হয়েছে তবে না একটি sigil পূর্বে, যে নাম একটি খালি শব্দ বলা হয় ।
বেয়ারওয়ার্ডগুলি বিভিন্ন উদ্দেশ্যে পরিবেশন করে তবে এগুলি সাধারণত একটি অন্তর্নির্মিত ফাংশন বা কোনও ব্যবহারকারী-সংজ্ঞায়িত সাবরুটিনকে প্রোগ্রামে সংজ্ঞায়িত করা হয় (বা প্রোগ্রাম দ্বারা ব্যবহৃত মডিউলটিতে)। পার্লের কোনও অন্তর্নির্মিত ফাংশন b1বা বলা হয় না DAT, সুতরাং পার্ল দোভাষী যখন কোডটি দেখেন b1.DAT, তখন এটি চিকিত্সা করার চেষ্টা করে b1এবং DATসাবরটাইনগুলির নাম হিসাবে বিবেচনা করে । এই ধরণের কোনও সাবরুটাইন সংজ্ঞায়িত করা হয় নি, এটি ব্যর্থ হয়। তারপরে, প্রদত্ত সীমাবদ্ধতাগুলি সক্ষম করা হয়নি, এটি তাদেরকে স্ট্রিং হিসাবে বিবেচনা করে। এটি কার্যকর হবে, যদিও আপনি বাস্তবে এটি ঘটানোর ইচ্ছা করেছিলেন বা না করা কারও অনুমান। পার্লের .অপারেটর স্ট্রিংগুলি সম্মিলন করে , তাই b1.DATস্ট্রিংয়ের মূল্যায়ন করেb1DAT। এটি, বা এর b1.DATমতো কিছু লেখার একটি খারাপ উপায় ।'b1' . 'DAT'"b1" . "DAT"
আপনি কমান্ডটি চালিয়ে নিজে এটি পরীক্ষা করতে পারেন perl -E 'say b1.DAT', যা শর্ট পার্ল স্ক্রিপ্টটি say b1.DATপার্ল ইন্টারপ্রেটারে প্রেরণ করে , যা এটি চালায়, মুদ্রণ করে b1DAT। (যে কমান্ডে, ' 'কোট শেল পাস বলতে say b1.DATঅন্যথায়, স্থান কারণ হবে; একটি একক কম্যান্ড-লাইন আর্গুমেন্ট হিসাবে sayএবং b1.DATকরা পৃথক শব্দ হিসাবে পার্স এবং perlতাদের পৃথক আর্গুমেন্ট হিসাবে পাবে। perlনেই না , কোট দেখতে নিজেদের শেল এগুলি সরিয়ে দেয় ))
তবে এখনuse strict; পার্ল স্ক্রিপ্টে আগে লেখার চেষ্টা করুনsay । আপনি যে একই ধরণের ত্রুটি পেয়েছেন তা এখন এটি ব্যর্থ rename:
$ perl -E 'use strict; say b1.DAT'
Bareword "b1" not allowed while "strict subs" in use at -e line 1.
Bareword "DAT" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
এটি ঘটেছে কারণ use strict;পার্ল দোভাষীকে খালি শব্দগুলি স্ট্রিং হিসাবে ব্যবহার করা নিষিদ্ধ করেছে। এই বিশেষ বৈশিষ্ট্যটি নিষিদ্ধ করতে, এটি কেবলমাত্র subsসীমাবদ্ধতা সক্ষম করার জন্য যথেষ্ট হবে । এই কমান্ডটি উপরের মতো একই ত্রুটি তৈরি করে:
perl -E 'use strict "subs"; say b1.DAT'
তবে সাধারণত পার্ল প্রোগ্রামাররা কেবল লিখবেন use strict;, যা subsসীমাবদ্ধতা এবং অন্য দু'জনকে সক্ষম করে । use strict;সাধারণত অনুশীলন সুপারিশ করা হয়। কমান্ডটি আপনার কোডের জন্য এটি renameকরে । এজন্য আপনি সেই ত্রুটি বার্তাটি পান।
৪. সংক্ষেপে, এটি ঘটেছিল:
- আপনার শেলটি
b1.DATপ্রথম কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করেছে, যা renameপ্রতিটি পথের নাম যুক্তির জন্য লুপে চালানোর জন্য পার্ল কোড হিসাবে বিবেচিত।
- এটি বোঝাতে নেওয়া হয়েছিল
b1এবং অপারেটরের DATসাথে সংযুক্ত ছিলেন .।
b1এবং DATসিগিলের সাথে উপসর্গ করা হয়নি, সুতরাং তাদেরকে ন্যাওয়ারওয়ার্ড হিসাবে ধরা হয়েছিল।
- এই দুটি বেনওয়ার্ডগুলি অন্তর্নির্মিত ফাংশন বা কোনও ব্যবহারকারী-সংজ্ঞায়িত সাবরুটাইনগুলির নাম হিসাবে নেওয়া হত, তবে এই জাতীয় কোনও নামই এই নামগুলির কোনওটিই ছিল না।
- যদি "কঠোর সাবস" সক্ষম না করা হয়, তবে তারা স্ট্রিং এক্সপ্রেশন
'b1'এবং 'DAT'এবং ক্যানকেনটেটেডের মতো আচরণ করা হত । এটি আপনি যা চেয়েছিলেন তা থেকে অনেক দূরে, যা এই বৈশিষ্ট্যটি প্রায়শই সহায়ক হয় না তা আলোকিত করে।
- কিন্তু "কঠোর Subs" সক্ষম হয়েছে, কারণ
renameসব সম্ভব বিধিনিষেধ ( vars, refs, এবং subs)। সুতরাং, পরিবর্তে আপনি একটি ত্রুটি পেয়েছেন।
renameএই ত্রুটির কারণে প্রস্থান করুন। কারণ এই ধরণের ত্রুটিটি প্রথম দিকে ঘটেছিল, আপনি পাস না করেও কোনও ফাইল নামকরণের চেষ্টা করা হয়নি -n। এটি একটি ভাল জিনিস, যা ব্যবহারকারীদের প্রায়শই অনিচ্ছাকৃত ফাইলের নাম পরিবর্তন থেকে এবং মাঝে মধ্যে এমনকি প্রকৃত ডেটা ক্ষতি থেকে রক্ষা করে।
ধন্যবাদ যেতে Zanna , যিনি সাহায্য করেছিলেন আমাকে এই উত্তর একজন ealier ড্রাফ্টে বেশ কিছু গুরুত্বপূর্ণ ত্রুটি-বিচ্যুতি । তাকে ছাড়া এই উত্তরটি কোনওভাবেই কম ধারণা তৈরি করতে পারত এবং সম্ভবত এটি পোস্ট করা যাচ্ছিল না।