2011-05-27 16 views
5

मुझे विंडोज़ में पर्ल के लिए कमांड तर्क कोटेशन को समझने में समस्या हो रही है। निम्नलिखित प्रोग्राम का उपयोग करना:पर्ल कमांड लाइन: निर्देशिका बनाम के लिए सिंगल बनाम डबल कोट्स

use strict; 
use warnings; 
use File::Find; 
use File::Copy; 

my $dir = shift; 

die 'Usage: perl Folderize.pl <directory>' unless $dir; 

die "$dir doesn't exist" unless -d $dir; 

मुझे निर्देशिका के लिए सिंगल या डबल कोट्स का उपयोग करने के आधार पर अलग-अलग परिणाम मिलते हैं। अगर मैं इसे 'perl script.pl 'H:\Test!' के साथ कॉल करता हूं तो यह "एच: \ टेस्ट!" प्रिंट करता है मौजूद नहीं है "। हालांकि, अगर मैं इसे 'perl script.pl "H:\Test!" के साथ कॉल करता हूं, तो यह ठीक काम करता है। ये क्यों हो रहा है?

+0

क्या होता है यदि आप perl कोड में $ dir के उपयोग को डीबीएल-उद्धृत करते हैं? शुभ लाभ। – shellter

+0

'-d" $ dir "अभी भी विफल रहता है यदि कमांड लाइन पर सिंगल कोट्स का उपयोग किया गया था। किसी भी उद्धरण का उपयोग करना इस मामले में भी काम करता है, लेकिन केवल इसलिए कि पथ में कोई स्थान नहीं है। –

+0

क्या आप वाकई कहते हैं कि 'एच: \ टेस्ट!' मौजूद नहीं है? और 'एच: \ टेस्ट' नहीं? – Quentin

उत्तर

4

कमांड लाइन पर, उद्धरण नियम शैल का अधिकार हैं, न कि कार्यक्रम (perl)। यूनिक्स शैल के नियम पर्ल के लिए नियमों के समान हैं (डबल कोट इंटरपोलेट चर, सिंगल कोट्स नहीं) लेकिन विंडोज़ "शैल" के अलग-अलग नियम हैं।कुछ मुख्य अंतर हैं:

  • एकल उद्धरण ' विशेष वर्ण

    नहीं है C:>\ dir > 'foo'

एक फ़ाइल 'foo' कहा जाता है (उद्धरण फ़ाइल नाम में शामिल किया जाएगा)

पैदा करेगा
  • ,210 दोहरे उद्धरण चिह्नों वातावरण चर कि %NAME% की तरह लग रहे अंतर्वेशन, लेकिन यह वातावरण चर के रूप में पर्ल अदिश चर नाम की व्याख्या करने की कोशिश नहीं करेगा:

    C:>\ perl -e "print '%PATH'"

  • विंडोज खोल "बंद" होगा आप के लिए अपने बोली अगर आप भूल

    C:>\ perl -e "print qq/Hello world/

    Hello world

यह काम करता है भले ही मैं दूसरे डबल कोट का उपयोग करना भूल गया।

0

ड्राइव अक्षर के कारण मुझे लगता है कि आप विंडोज (अंगूठे) के तहत काम करते हैं। तो आपको बस स्वीकार करना होगा, कि डबल कोट्स एक और एकमात्र उद्धरण हैं।

0

getopt :: का उपयोग करते हुए लांग के बजाय अपने खुद के तर्क इस मामले dir में

http://perldoc.perl.org/Getopt/Long.html

use Getopt::Long; 


    GetOptions 
    (
     'dir=s' => \$dir, 
    ) or die ("Couldnot process arguments"); 

को पार्स कर निर्देशिका होगा उपयोगकर्ता

yourscript.pl -dir = foo 
    yourscript.pl -dir "foo" 
    yourscript.pl -dir foo 

करता है कि क्या आप हैं पर विचार करें यह

GetOptions 
    (
     '[email protected]' => \@dir, 
    ) or die ("Couldnot process arguments"); 

आप एक सादे पुराने सरणी

yourscript.pl -dir foo -dir blah 
+0

ओपी स्विचेस का कोई पार्सिंग नहीं कर रहा है, इसलिए गेटोपेट :: यहां कुछ भी नहीं करता है। – mkb

+1

बहुत अच्छा। मुझे लगता है कि मैं इस जगह का उपयोग करूंगा, हालांकि इस स्क्रिप्ट में नहीं क्योंकि मैं केवल एक तर्क का विश्लेषण कर रहा हूं। –

1

यह पर्ल दुभाषिया के साथ कोई संबंध नहीं है में सभी निर्देशिकाओं मिल जाएगा। यह वह खोल है जो कमांड और उनके तर्कों का अर्थ देता है।

जब आप डबल-उद्धृत तर्क प्रदान करते हैं, उदाहरण के लिए "H:\Test!", खोल स्ट्रिंग की सामग्री के रूप में उद्धरण के अंदर सबकुछ का व्यवहार करता है, और पर्ल दुभाषिया को जो पास किया जाता है वह उद्धरण के बिना स्ट्रिंग होता है।

इसके विपरीत, जब आप 'H:\Test!' की आपूर्ति करते हैं, तो खोल स्ट्रिंग के हिस्से के रूप में एकल उद्धरण लेता है, और इसे पर्ल दुभाषिया के लिए इस तरह से पास करता है।

+1

उस फ़ाइल नाम के साथ, शायद यह बैश नहीं है, और bash स्ट्रिंग के हिस्से के रूप में एकल उद्धरण पास नहीं करता है। – Quentin

+0

मैंने शेबांग लाइन हटा दी। मेरे पास आदत से बाहर है, लेकिन मुझे इसकी आवश्यकता नहीं है क्योंकि मैं विंडोज पर काम करता हूं। –

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