পার্লের মুদ্রণ কীভাবে ডিফল্টরূপে একটি নতুন লাইন যুক্ত করতে পারে?


96

পার্লে আমার বেশিরভাগ printবক্তব্য ফর্ম নেয় take

print "hello." . "\n";

আশেপাশে সমস্ত all "n" lying n "পড়ে থাকা এড়ানোর কোনও ভাল উপায় আছে?

আমি জানি যে আমি একটি নতুন ক্রিয়াকলাপ করতে পারি myprintযেগুলি স্বয়ংক্রিয়ভাবে সংযোজন করে \ n, তবে আমি বিদ্যমানটিকে ওভাররাইড করতে পারলে ভাল লাগবে print


10
যদি আপনার উত্তরে $ includes অন্তর্ভুক্ত থাকে তবে দয়া করে নিশ্চিত হয়ে নিন যে এটি অদৃশ্য প্রভাবের সাথে বৈশ্বিক চলক নির্ধারণের বিষয়ে সতর্কতার তালিকার সাথে আসে। যদিও এটি খুব চালাক এবং প্রযুক্তিগতভাবে প্রশ্নের উত্তর দেয়, তবে এটি একটি নবজাতকের কাছে অযোগ্যকে হস্তান্তর করা খুব বিপজ্জনক।
শোওয়ার্ন

4
perldoc perlvarবেশিরভাগ ক্যাভেটের বর্ণনা দেয়, এখানে কেন তাদের বেলাবর করা উচিত?
ডেভিড এম

5
@ ডেভিড, কারণ কিছু এলোমেলো হ্যাকার এখানে উত্তরগুলি পের্লডোকের পরিবর্তে গুগল করবে, তাদের সাথে সন্তুষ্ট হবে এবং গুপ্তচরদের সম্পর্কেও জানতে পারবে না!
পি শেভ

4
ঠিক এই ধরণের উদ্ভট যুক্তির ফলেই আমার লৌহকে একটি সতর্কতা লেবেল লাগিয়েছে যে আমি যখন কাপড় পরেছি তখন আমার আর লোভ করা উচিত নয়।
ডেভিড এম

8
বাস্তব-জীবনের সরঞ্জামগুলির শারীরিক সীমাবদ্ধতা রয়েছে যা শারীরিক বিশ্বে তাদের জীবনযাপনকারী লোকদের দ্বারা যুক্তিসঙ্গতভাবে বোঝা যায়। সফ্টওয়্যার সরঞ্জামগুলি এ জাতীয় কোনও সীমাবদ্ধতার দ্বারা আবদ্ধ এবং কোনও নিয়ম নেই। তারা কিছু করতে পারে এবং ঘন ঘন বাইরের প্রত্যাশাগুলি আচরণ করে, বিশেষত এমন নবজাতকদের জন্য যারা এখনও যুক্তিসঙ্গত প্রত্যাশার সীমানা শিখেনি।
ইথার

উত্তর:


101

পার্ল 6 এর sayক্রিয়াটি স্বয়ংক্রিয়ভাবে সংযোজন করে \n

আপনি sayযুক্ত করলে পার্ল 5.10 বা 5.12 এও ব্যবহার করতে পারেন

use feature qw(say);

আপনার প্রোগ্রামের শুরুতে। অথবা আপনি এই এবং অন্যান্য বৈশিষ্ট্যগুলি পেতে আধুনিক :: পার্ল ব্যবহার করতে পারেন ।

আরও তথ্যের জন্য পার্লডোক বৈশিষ্ট্যটি দেখুন ।


7
আসলে, আপনাকে যা করতে হবে তা হ'ল use 5.012;বা use 5.010;আপনি যদি নতুন এইগুলি চালাচ্ছেন তবে তা পাওয়া perl
রবার্ট পি

অনুমান করা কি নিরাপদ নয় যে পার্ল 6 সুনির্দিষ্টভাবে উল্লেখ না করা থাকলে প্রশ্নটি পার্ল 5 কে বোঝায়?
wobbily_col

37

আপনি -lশে-ব্যাং শিরোনামে বিকল্পটি ব্যবহার করতে পারেন :

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

আউটপুট:

hello
hello

4
খুব সুন্দর. আরো perlসহ কি অপশন, -lকরছে, এখানে
রাফিন

4
কারণ এটি একটি বিশ্বব্যাপী, এটি ওয়ান-লাইনার এবং স্ক্রিপ্টের ক্ষুদ্রতম ব্যতীত অন্য কোনও ক্ষেত্রে খারাপ অভ্যাস।
শোয়ার্ন

24

পার্ল ৫.১০+ যদি কোনও বিকল্প না হয় তবে এখানে একটি দ্রুত এবং নোংরা অনুমান। এটি হুবহু এক নয়, যেহেতু যখন প্রথম আর্গটি হ্যান্ডেল হয় তখন বলার কিছু ম্যাজিক থাকে তবে স্টক প্রিন্টের জন্য:

sub say {print @_, "\n"}

say 'hello';

20

আপনি আপনার মুদ্রণ বিবৃতিটি যেভাবে লিখছেন তা অযথা ভার্চুজের। নতুন লাইনের নিজস্ব স্ট্রিংয়ে আলাদা করার দরকার নেই। এটি যথেষ্ট।

print "hello.\n";

এই উপলব্ধিটি আপনার কোডিংটি সাধারণভাবে সহজ করে তুলবে।

ব্যবহারের ক্ষেত্রে use feature "say"বা use 5.10.0বা use Modern::Perlসালে নির্মিত পেতে sayবৈশিষ্ট্য, আমি কুটনি যাচ্ছি perl5i ডিফল্টরূপে যুক্তিসম্মত অনুপস্থিত পার্ল 5 বৈশিষ্ট্য অনেক যা পালাক্রমে।


10

সম্ভবত আপনি নিজের আউটপুট রেকর্ড বিভাজকটিকে লাইনফিডে পরিবর্তন করতে চান:

local $\ = "\n";

$ perl -e 'print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o   g   o   o   d   b   y   e                
0000014
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o  \n   g   o   o   d   b   y   e  \n        
0000016

আপডেট: আমার উত্তর পরামর্শের চেয়ে দক্ষতার সাথে কথা বলে। আমি লাইনের শেষে "es n" যুক্তটিকে "বেদনা" কাজ হিসাবে বিবেচনা করি না, তবে কেউ যদি সত্যিই সেগুলি এড়াতে চায় তবে এটি একটি উপায়। এই কৌশলটি ব্যবহার করে যদি আমাকে কিছুটা কোড বজায় রাখতে হত তবে আমি সম্ভবত এটি সম্পূর্ণরূপে রিফ্যাক্টর করতাম।


6
না, দয়া করে এটি করবেন না। প্রযুক্তিগতভাবে সঠিক উত্তর থাকাকালীন তুচ্ছ হিসাবে কোনও কিছুতে বিশেষ ভেরিয়েবল ব্যবহার করা কারণ এটি রাস্তার নিচে রক্ষণাবেক্ষণের বোঝা।
tsee

4
@ আমি সম্পূর্ণরূপে একমত, আসলে। আমি ইঙ্গিত করার জন্য আমার উত্তরটি সম্পাদনা করার সাথে সাথে আমার উত্তরটি সক্ষমতা বর্ণনা করে, এমনকি যদি কেউ এটি সাধারণ অনুশীলন হিসাবে প্রস্তাব না দেয়।
ডেভিড এম

আসল বিপদটি এই ঘটনাটি থেকে আসে যে সমস্ত কোড এখন নতুন লাইনগুলি যুক্ত করবে, এমনকি অন্যান্য ব্যক্তির মডিউলগুলিতেও কোড আশা করবে না। নেটওয়ার্কিং কোডটি কল্পনা করুন "helo\r\n"যা এখন যে বার্তাটি প্রেরণ করে তা প্রেরণ করবে "helo\r\n\n"
চস 14

অবশ্যই আপনি অন্যান্য কোডটি প্রভাবিত না করার জন্য এটিকে সর্বদা স্থানীয় করে তুলতে পারেন তবে আপনার local $\ = "\n";
সাব্রোটিনটিকে আরও

কমান্ড ফ্ল্যাগটি -lকমান্ড লাইন ওয়ান- লাইনারদের জন্য দুর্দান্ত (দেখুন perldoc.perl.org/perlrun.html# কম্যান্ড- সুইচস )। আমি এটি কোনও বৃহত্তর প্রোগ্রামে সুপারিশ করব না।
ডিজেডি

4

Https://perldoc.perl.org/perlvar.html এ আমি যা পেয়েছি তা এখানে :

\ The প্রিন্ট অপারেটরের জন্য আউটপুট রেকর্ড বিভাজক। যদি সংজ্ঞায়িত করা হয় তবে এই মানটি মুদ্রণের শেষ যুক্তির পরে মুদ্রিত হবে। ডিফল্ট অপরিশোধিত।

আপনি কোনও স্ট্যান্ডিক পদ্ধতি হিসাবে কোনও হ্যান্ডেলটিতে আউটপুট_রেকার্ড_সেস্পেটর () কল করতে পারবেন না। আইও দেখুন: হ্যান্ডেল করুন।

স্মৃতিচারণ: আপনি মুদ্রণের শেষে "\ n" যুক্ত করার পরিবর্তে set set সেট করেছেন। এছাড়াও, এটি ঠিক $ / এর মতো, তবে আপনি পার্লের থেকে "ফিরে" পেয়েছেন।

উদাহরণ:

$\ = "\n";
print "a newline will be appended to the end of this line automatically";


1

যদি আপনি প্রাক-5.10 এর সাথে আটকে থাকেন তবে উপরে প্রদত্ত সমাধানগুলি sayফাংশনটির সম্পূর্ণরূপে প্রতিলিপি দেবে না । উদাহরণ স্বরূপ

sub say { print @_, "\n"; }

যেমন অনুরোধের সাথে কাজ করবে না

say for @arr;

বা

for (@arr) {
    say;
}

... কারণ উপরের ফাংশনটি অন্তর্নিহিত গ্লোবাল $_লাইক printএবং আসল ফাংশনটিতে কাজ করে না say

আরও ঘনিষ্ঠভাবে পার্ল প্রতিলিপি করতে 5.10+ sayআপনি এই ফাংশনটি চান

sub say {
    if (@_) { print @_, "\n"; }
    else { print $_, "\n"; }
}

যা এখন এটির মতো কাজ করে

my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#

sayPerl6 মধ্যে builtin একটু ভিন্নভাবে আচরণ করে। এটিকে চালিয়ে যাওয়া say @arrবা @arr.sayকেবল অ্যারে আইটেমগুলিকে একত্রিত করবে না, বরং তালিকার বিভাজকের সাথে পৃথক করে প্রিন্ট করবে। এটি perl5 এ প্রতিলিপি করতে আপনি এটি করবেন

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$"গ্লোবাল তালিকার বিভাজক পরিবর্তনশীল, বা আপনি যদি ব্যবহার করছেন English.pmতবে তা হয়$LIST_SEPARATOR

এটি এখন আরও বেশি পার্ল 6 এর মতো কাজ করবে

say @arr;
# OUTPUT
# alpha beta gamma
#
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.