पर्ल का प्रिंट डिफ़ॉल्ट रूप से एक नई पंक्ति कैसे जोड़ सकता है?


95

पर्ल में मेरे अधिकांश printबयान फॉर्म लेते हैं

print "hello." . "\n";

वहाँ सभी pesky "\ n" के आसपास रखने से बचने के लिए एक अच्छा तरीका है?

मुझे पता है कि मैं एक नया फ़ंक्शन बना सकता हूं जैसे myprintकि स्वचालित रूप से \ n एपेंड करता है, लेकिन यह अच्छा होगा यदि मैं मौजूदा को ओवरराइड कर सकता हूं print


10
यदि आपके उत्तर में $ \ _ शामिल है, तो सुनिश्चित करें कि यह अदृश्य प्रभाव के साथ वैश्विक चर सेट करने के बारे में कैविट्स की सूची के साथ आता है। जबकि इसकी बहुत ही चतुर और तकनीकी रूप से इस सवाल का जवाब है, यह भी एक नौसिखिया को अयोग्य घोषित करने के लिए बहुत खतरनाक है।
श्वेर्न ने

1
perldoc perlvarअधिकांश केवेट का वर्णन करता है, उन्हें यहाँ क्यों चित्रित किया गया है?
डेविड एम

5
@ डेविड, क्योंकि कुछ रैंडम हैकर पेरालोक के बजाय यहाँ जवाबों को गूगल करेंगे, उनसे संतुष्ट हो जाएँ, और कैविट्स के बारे में भी नहीं जान पाएंगे!
पी शेव्ड

2
यह ठीक उसी प्रकार का विचित्र तर्क है जिसके परिणामस्वरूप मेरा लोहा चेतावनी का लेबल लगा हुआ है कि मुझे कपड़े पहनते समय लोहे के कपड़े नहीं पहनने चाहिए।
डेविड एम

8
वास्तविक जीवन के साधनों की भौतिक सीमाएँ होती हैं, जो भौतिक दुनिया में अपना जीवन व्यतीत करने वाले लोगों द्वारा यथोचित समझ में आती हैं। सॉफ़्टवेयर उपकरण ऐसी सीमाओं से बंधे हैं, और कोई नियम नहीं हैं। वे कुछ भी कर सकते हैं, और अक्सर बाहर की अपेक्षाओं का व्यवहार करते हैं, खासकर शुरुआती लोगों के लिए जिन्होंने अभी तक उचित उम्मीदों की सीमाओं को नहीं सीखा है।
ईथर

जवाबों:


99

पर्ल 6 में sayफ़ंक्शन होता है जो स्वचालित रूप से जोड़ता है \n

sayयदि आप जोड़ते हैं तो आप पर्ल 5.10 या 5.12 में भी उपयोग कर सकते हैं

use feature qw(say);

अपने कार्यक्रम की शुरुआत के लिए। या आप इसे और अन्य सुविधाओं को प्राप्त करने के लिए आधुनिक :: पर्ल का उपयोग कर सकते हैं ।

देखें perldoc सुविधा अधिक जानकारी के लिए।


7
वास्तव में, आपको बस इतना करना है use 5.012;या use 5.010;यदि आप उन नए perlएस को चला रहे हैं तो इसे प्राप्त करना है ।
रॉबर्ट पी

क्या यह मान लेना सुरक्षित नहीं है कि जब तक पर्ल 6 का विशेष रूप से उल्लेख नहीं किया जाता है कि प्रश्न पर्ल 5 को संदर्भित करता है?
wobbily_col

35

आप -lशी-बैंग हैडर में विकल्प का उपयोग कर सकते हैं :

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

आउटपुट:

hello
hello

3
बहुत अच्छा। perlविकल्पों पर अधिक , क्या -lकर रहा है सहित , यहाँ
रफिन

1
क्योंकि यह एक वैश्विक है, यह किसी भी चीज़ में बुरा व्यवहार है, लेकिन एक-लाइनर और लिपियों का सबसे कठिन है।
श्वेर्न

24

यदि पर्ल 5.10+ एक विकल्प नहीं है, तो यहां एक त्वरित और गंदा सन्निकटन है। यह बिल्कुल वैसा ही नहीं है, क्योंकि कहते हैं कि कुछ जादू है जब इसकी पहली arg एक संभाल है, लेकिन मुद्रण के लिए:

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

say 'hello';

20

जिस तरह से आप अपना प्रिंट स्टेटमेंट लिख रहे हैं, वह अनावश्यक रूप से क्रिया है। न्यूलाइन को अपनी स्ट्रिंग में अलग करने की कोई आवश्यकता नहीं है। यह पर्याप्त है।

print "hello.\n";

यह अहसास संभवत: आपके कोडिंग को सामान्य बना देगा।

उपयोग करने के अलावा use feature "say"या use 5.10.0या use Modern::Perlमें बनाया पाने के लिए sayसुविधा है, मैं दलाल करने जा रहा हूँ perl5i डिफ़ॉल्ट रूप से समझदार लापता पर्ल 5 सुविधाओं का एक बहुत पर जो बदल जाता है।


9

शायद आप अपने आउटपुट रिकॉर्ड सेपरेटर को बदलना चाहते हैं:

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

अद्यतन: मेरा जवाब सलाह के बजाय क्षमता के लिए बोलता है। मैं "pesky" कोर होने के लिए लाइनों के अंत में "\ n" जोड़ने का संबंध नहीं करता, लेकिन अगर कोई वास्तव में उनसे बचना चाहता है, तो यह एक तरीका है। अगर मुझे इस तकनीक का उपयोग करने वाले कोड का एक सा बनाए रखना होता, तो मैं शायद इसे सर्वनाम कर देता।


6
नहीं, कृपया ऐसा न करें। जबकि तकनीकी रूप से एक सही उत्तर, तुच्छ के रूप में कुछ के लिए एक विशेष चर का उपयोग करना क्योंकि यह सड़क के नीचे एक रखरखाव बोझ है।
tsee

1
@ मैं वास्तव में पूरी तरह से सहमत हूं। जैसा कि मैंने इंगित करने के लिए अपने उत्तर को संपादित किया है, मेरा उत्तर क्षमता का वर्णन करता है, भले ही कोई इसे सामान्य अभ्यास के रूप में सुझाए नहीं।
डेविड एम

वास्तविक खतरा इस तथ्य से आता है कि सभी कोड अब नए लिंक जोड़ेंगे, यहां तक ​​कि अन्य लोगों के मॉड्यूल में भी कोड जो इसकी उम्मीद नहीं कर रहे थे। नेटवर्किंग कोड की कल्पना करें "helo\r\n"जो अब भेजे गए संदेश को भेजेगा "helo\r\n\n"
चास।

बेशक आप हमेशा इसे अन्य कोड को प्रभावित करने से बचने के लिए स्थानीय बना सकते हैं, लेकिन फिर भी अपने सबरूटीन को थोड़ा साफ दिखना चाहते हैं:local $\ = "\n";
redbmk

-lकमांड लाइन वन-लाइनर्स के लिए कमांड फ्लैग का उपयोग करना महान है (देखें perldoc.perl.org/perlrun.html#Command-Switches )। मैं किसी भी बड़े कार्यक्रम में इसकी सिफारिश नहीं करूंगा।
djd

4

यहाँ मुझे https://perldoc.perl.org/perlvar.html पर क्या मिला है :

$ \ _ प्रिंट ऑपरेटर के लिए आउटपुट रिकॉर्ड सेपरेटर। यदि परिभाषित किया गया है, तो यह मूल्य प्रिंट के तर्कों के अंतिम के बाद मुद्रित होता है। डिफ़ॉल्ट अपरिभाषित है।

आप किसी हैंडल पर output_record_separator () कॉल नहीं कर सकते, केवल एक स्थिर विधि के रूप में। IO :: हैंडल देखें।

Mememonic: आपने प्रिंट के अंत में "\ n" जोड़ने के बजाय $ \ _ सेट किया। इसके अलावा, यह सिर्फ $ / की तरह है, लेकिन यह वही है जो आपको पर्ल से "वापस" मिलता है।

उदाहरण:

$\ = "\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 में निर्मित थोड़ा अलग तरह से व्यवहार करता है। इसके साथ इनवाइट करना say @arrया @arr.sayकेवल एरे आइटम को समेटना नहीं होगा, बल्कि उन्हें लिस्ट सेपरेटर से अलग कर देता है। इसे perl5 में दोहराने के लिए आप ऐसा करेंगे

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

$"वैश्विक सूची विभाजक चर है, या यदि आप उपयोग कर रहे हैं English.pmतो है$LIST_SEPARATOR

यह अब perl6 की तरह अधिक कार्य करेगा, जैसे

say @arr;
# OUTPUT
# alpha beta gamma
#
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.