2011-05-30 7 views
15

में चर मुद्रित करने के लिए मैं कुछ कोड लग रहा है किकैसे पर्ल

तरह
my ($ids,$nIds); 
while (<myFile>){ 
    chomp; 
    $ids.= $_ . " "; 
    $nIds++; 
} 

यह मेरा myFile में हर पंक्ति को श्रेणीबद्ध करना चाहिए, और nIds लाइनों की मेरा नंबर होना चाहिए। मैं अपना $ids और $nIds कैसे प्रिंट करूं?

मैंने बस print $ids की कोशिश की, लेकिन पर्ल शिकायत करता है।

my ($ids, $nIds) 

एक सूची है, है ना? दो तत्वों के साथ?

+8

के लिए -1 के बजाय वास्तविक संदेश का पाठ साझा करने के बजाय "पर्ल शिकायत"। – tadmc

उत्तर

16
print "Number of lines: $nids\n"; 
print "Content: $ids\n"; 

पर्ल ने शिकायत कैसे की? print $ids काम करना चाहिए, यद्यपि आप अंत में print के साथ स्पष्ट रूप से say या -l/$\ का उपयोग करके स्पष्ट रूप से एक नई लाइन चाहते हैं।

आप एक स्ट्रिंग में एक चर को जोड़ और उस चर का हिस्सा की तरह लग रहा होगा लेकिन है नहीं यह बाद तुरंत कुछ है चाहते हैं, {} में चर नाम संलग्न:

print "foo${ids}bar"; 
+0

अरे, बस सोच रहा है, अगर मैं चर के बाद तुरंत कुछ प्रिंट करना चाहता हूं, यानी, मैं इसे प्राप्त करना चाहता हूं: 'प्रिंट "सामग्री: $ idsHeyIamhere" ' – Juto

+0

@Juto: मेरे उत्तर में जोड़ा गया – ysth

7
मैं अपने $ ids और $ nIds कैसे प्रिंट करूं?
print "$ids\n"; 
print "$nIds\n"; 
मैंने बस print $ids की कोशिश की, लेकिन पर्ल शिकायत करता है।

क्या शिकायत करता है? अनियंत्रित मूल्य? शायद फ़ाइल को खोलने में त्रुटि के कारण आपका लूप कभी नहीं दर्ज किया गया था। यह सुनिश्चित करना सुनिश्चित करें कि open ने कोई त्रुटि लौटा दी है, और सुनिश्चित करें कि आप use strict; use warnings; का उपयोग कर रहे हैं।

my ($ids, $nIds) एक सूची है, है ना? दो तत्वों के साथ?

यह एक (बहुत विशेष) फ़ंक्शन कॉल है। $ids,$nIds दो तत्वों के साथ एक सूची है।

9

तुम हमेशा करना चाहिए एक प्रश्न पूछते समय सभी प्रासंगिक कोड शामिल करें। इस मामले में, प्रिंट स्टेटमेंट जो आपके प्रश्न का केंद्र है। प्रिंट स्टेटमेंट शायद जानकारी का सबसे महत्वपूर्ण हिस्सा है। जानकारी का दूसरा सबसे महत्वपूर्ण टुकड़ा त्रुटि है, जिसमें आपने भी शामिल नहीं किया था। अगली बार, उन दोनों को शामिल करें।

print $ids गड़बड़ करने के लिए काफी कठिन कथन होना चाहिए, लेकिन यह संभव है। संभावित कारण:

  1. $ids अपरिभाषित है। चेतावनी देता है undefined value in print
  2. $ids दायरे से बाहर है। use strict के साथ, घातक चेतावनी Global variable $ids needs explicit package name, और अन्यथा अपरिभाषित ऊपर से चेतावनी देता है।
  3. आप लाइन के अंत में अर्ध-कॉलन भूल गए हैं।
  4. आप 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 + 1scalar @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. 
+0

क्या आप वाकई हैं? जब मैं '$ सरणी [500] =" yada "कहता हूं, तो मुझे' scalar @ array' के लिए मान 501 मिलता है। – BarneySchmale