2012-10-24 18 views
9

मैं चरम दायरे को समझने और पर्ल में उचित रूप से घोषित करने की कोशिश कर रहा हूं, और मुझे कठिन समय है।पर्ल में वैश्विक चर घोषित करने के लिए कैसे करें?

नीचे दिया गया कोड मूल रूप से एक्सेल फ़ाइल में पढ़ता है, इसे पार करता है, और इसे एक नई एक्सेल फ़ाइल में थूकता है।

हालांकि, मैं शीर्षकों में से एक को पढ़ने की कोशिश कर रहा हूं, और यदि हेडर मेरी स्ट्रिंग से मेल खाता है, तो मैं उस कॉलम नंबर को रिकॉर्ड करना चाहता हूं, और बाद में कोड में इसका उपयोग करना चाहता हूं।

मुझे "/parser.pl लाइन 38 पर प्रिंट में अनियमित मूल्य $ site_name_col का उपयोग मिल रहा है। "

लाइन 38 "प्रिंट $ site_name_col;"

मुझे एहसास है कि यह प्रिंट स्टेटमेंट {} के बाहर है जहां चर प्रारंभ में प्रारंभ किया गया था, लेकिन इसे कोड की शुरुआत में वैश्विक चर के रूप में घोषित किया गया था, तो क्या देता है?

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use vars qw($site_name_col); 
use Spreadsheet::WriteExcel; 
use Spreadsheet::ParseExcel; 

my ($fname1) = @ARGV; 

my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse($fname1); 

my $new_workbook = Spreadsheet::WriteExcel->new('formated_list.xls', $fname1); 

if (!defined $workbook) { 

    die $parser->error(), ".\n"; 
} 

for my $worksheet ($workbook->worksheets()) { 

    my ($wsheet_name) = $worksheet->get_name(); 
    my $new_worksheet = $new_workbook->add_worksheet($wsheet_name); 

    my ($row_min, $row_max) = $worksheet->row_range(); 
    my ($col_min, $col_max) = $worksheet->col_range(); 

    for my $row ($row_min .. $row_max) { 

     for my $col ($col_min .. $col_max) { 

      my $cell = $worksheet->get_cell($row, $col); 
      next unless $cell; 

      print "Row, Col = ($row, $col)\n"; 

      if ($cell->value() =~ /Site Name/) { 

       $site_name_col = $col; 
      } 
      print $site_name_col; 

      $new_worksheet->write($row, $col, $cell->value()); 
     } 
    } 
} 

$new_workbook->close(); 
+2

आपने 'my' का उपयोग क्यों नहीं किया ?! – ikegami

उत्तर

5

use vars qw() अब और अनुशंसित नहीं है। वैश्विक चर उपयोग का घोषित करने के लिए our $my_var आपकी समस्या $cell->value() =~ /Site Name/ स्थिति से आ सकती है। यह शायद कभी नहीं मिला है इसलिए आपके चर को कभी भी मूल्य नहीं मिलता है।

0

आपको इस मामले में वैश्विक चर घोषित करने की आवश्यकता नहीं है, स्थानीय चर पर्याप्त है। नीचे उदाहरण देखें।

if ($cell->value() =~ /Site Name/) { 

    my $site_name_col = $col; 
    print $site_name_col; 
} 

या

my $site_name_col = ''; # default value 
if ($cell->value() =~ /Site Name/) { 

    $site_name_col = $col; 
} 
print $site_name_col; 
+1

आप सवाल का जवाब नहीं दे रहे हैं, क्यों? – Alex

1

बस स्पष्ट करने के लिए दूसरों को पहले से ही कहा है, एक चर my के साथ एक फ़ाइल के शीर्ष पर घोषित सुलभ और अपने पूरे फ़ाइल से प्रयोग करने योग्य है। इस मामले में वैश्विक चर के लिए कोई कारण नहीं है।

आप वैश्विक कब चाहते हैं?

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

यह स्पष्ट है कि आप उन चीजों में से कोई भी नहीं कर रहे हैं, इसलिए आपको बस my के साथ रहना चाहिए। यदि आप वैश्विक घोषित करना चाहते हैं, तो ऐसा करने का सही तरीका our के साथ है। उस आदेश के लिए कुछ महत्वपूर्ण subtleties हैं, लिंक किए गए दस्तावेज में समझाया।

3

मैं पहचान इस पोस्ट एक छोटे से पुराना है, लेकिन ... अभी भी (अपने आप की तरह) बाद में इस पेज वर्षों के लिए आने वाले लोगों के लिए:

मैं सोच भी इन कार्यपत्रकों आप में पढ़ रहे थे द्वारा बनाया गया है नहीं हो सकता है उत्कृष्टता आप। इसलिए, आप आवरण मुद्दों का सामना कर सकते हैं, और निश्चित रूप से regexes मामले संवेदनशील हैं। या तो चेक के दौरान डेटा को अपरकेस या लोअरकेस: if (lc($cell->value()) =~ /site name/) ...

our का उपयोग करें! वैश्विक होने के लिए बहुत सारे कारण हैं।SITE_NAME कुछ सभी फ़ाइलों की आवश्यकता हो सकती ...

Jarett होने लगते हैं

संपादित करें:

इतना बेहतर काम करेगा:

if ($cell->value()) =~ /site name/i) { print $col; }

बाहर मुद्रित करने के लिए करता है, तो कोई ज़रूरत नहीं बयान ... कुछ भी प्रिंटिंग बचाता है ... कई बार ....

संबंधित मुद्दे