तुम हमेशा करना चाहिए एक प्रश्न पूछते समय सभी प्रासंगिक कोड शामिल करें। इस मामले में, प्रिंट स्टेटमेंट जो आपके प्रश्न का केंद्र है। प्रिंट स्टेटमेंट शायद जानकारी का सबसे महत्वपूर्ण हिस्सा है। जानकारी का दूसरा सबसे महत्वपूर्ण टुकड़ा त्रुटि है, जिसमें आपने भी शामिल नहीं किया था। अगली बार, उन दोनों को शामिल करें।
print $ids
गड़बड़ करने के लिए काफी कठिन कथन होना चाहिए, लेकिन यह संभव है। संभावित कारण:
$ids
अपरिभाषित है। चेतावनी देता है undefined value in print
$ids
दायरे से बाहर है। use strict
के साथ, घातक चेतावनी Global variable $ids needs explicit package name
, और अन्यथा अपरिभाषित ऊपर से चेतावनी देता है।
- आप लाइन के अंत में अर्ध-कॉलन भूल गए हैं।
- आप
print $ids $nIds
करने की कोशिश की है, जिसमें मामले पर्ल सोचता है कि $ids
एक filehandle माना जाता है, और आप इस तरह के print to unopened filehandle
के रूप में कोई त्रुटि मिलती है।
स्पष्टीकरण
1: ऐसा नहीं होना चाहिए। यह तब होगा, जब कुछ इस तरह (आप strict
उपयोग नहीं कर रहे कल्पना करते हुए) कर सकते हैं:
my $var;
while (<>) {
$Var .= $_;
}
print $var;
, अपरिभाषित मूल्य के लिए चेतावनी देता है क्योंकि $Var
और $var
दो अलग चर हैं।
2:, हो सकता है यदि आप कुछ इस तरह करते हैं:
if ($something) {
my $var = "something happened!";
}
print $var;
my
वर्तमान ब्लॉक के अंदर चर की घोषणा की। ब्लॉक के बाहर, यह दायरे से बाहर है।
3: सरल पर्याप्त, सामान्य गलती, आसानी से तय की गई। use warnings
के साथ स्थान के लिए आसान है।
4: यह भी एक आम गलती है।
print "$var1 $var2"; # concatenation inside a double quoted string
print $var1 . $var2; # concatenation
print $var1, $var2; # supplying print with a list of args
अंत में, आप के लिए कुछ पर्ल जादू टिप्स::
use strict;
use warnings;
# open with explicit direction '<', check the return value
# to make sure open succeeded. Using a lexical filehandle.
open my $fh, '<', 'file.txt' or die $!;
# read the whole file into an array and
# chomp all the lines at once
chomp(my @file = <$fh>);
close $fh;
my $ids = join(' ', @file);
my $nIds = scalar @file;
print "Number of lines: $nIds\n";
print "Text:\n$ids\n";
एक सरणी में पूरी फ़ाइल पढ़ना तरीके का एक संख्या सही ढंग से एक ही print
बयान में दो चर मुद्रित करने के लिए कर रहे हैं केवल छोटी फाइलों के लिए उपयुक्त है, अन्यथा यह बहुत सारी मेमोरी का उपयोग करता है। आमतौर पर, लाइन-दर-रेखा को प्राथमिकता दी जाती है।
बदलाव:
print "@file"
$ids = join(' ',@file); print $ids;
$#file
के बराबर है @file
में पिछले सूचकांक वापस आ जाएगी। चूंकि सरणी आमतौर पर 0 से शुरू होती हैं, $#file + 1
scalar @file
के बराबर है।
तुम भी कर सकते हैं:
my $ids;
do {
local $/;
$ids = <$fh>;
}
अस्थायी रूप से करके $/
, इनपुट रिकॉर्ड विभाजक है, यानी न्यू लाइन "को बंद करने", आप <$fh>
वापसी पूरी फ़ाइल कर देगा। <$fh>
वास्तव में तब तक पढ़ा जाता है जब तक कि यह $/
नहीं पाता, फिर उस स्ट्रिंग को वापस कर दें। ध्यान दें कि यह $ids
में नई लाइनों को संरक्षित रखेगा।
लाइन-दर-पंक्ति समाधान:
open my $fh, '<', 'file.txt' or die $!; # btw, $! contains the most recent error
my $ids;
while (<$fh>) {
chomp;
$ids .= "$_ "; # concatenate with string
}
my $nIds = $.; # $. is Current line number for the last filehandle accessed.
के लिए -1 के बजाय वास्तविक संदेश का पाठ साझा करने के बजाय "पर्ल शिकायत"। – tadmc