2012-06-29 4 views
7

मैं #!/usr/bin/perl के बारे में googled, लेकिन मुझे कोई संतोषजनक उत्तर नहीं मिला। मुझे पता है कि यह एक सुंदर मूल बात है, लेकिन फिर भी, मुझे समझा सकता है कि पर्ल में #!/usr/bin/perl का महत्व क्या है? इसके अलावा, -w या -T#!/usr/bin/perl में साइन इन करता है? मैं पर्ल के लिए नौसिखिया हूँ, इसलिए कृपया धैर्य रखें।# या/usr/bin/perl में -T या -w का महत्व क्या है?

+2

'#!/Usr/bin/perl' को शेबांग लाइन कहा जाता है। चेतावनियों के लिए '-w'।' टी 'टेंट मोड के लिए। –

+4

'-w' कई सालों से अनुशंसित नहीं किया गया है। पर्ल 5.6.0 के बाद से हमने 'चेतावनियों का उपयोग किया है' जो अधिक शक्तिशाली और अधिक लचीला है। –

उत्तर

13

#! आमतौर पर "shebang" कहा जाता है और यह कंप्यूटर को स्क्रिप्ट चलाने के तरीके को बताता है। आपको #!/bin/sh या #!/bin/bash के साथ बहुत सी शैल-स्क्रिप्ट दिखाई देगी।

तो, /usr/bin/perl आपका पर्ल दुभाषिया है और यह चलाया जाता है और फ़ाइल को निष्पादित करने के लिए दिया जाता है।

शेष लाइन पर्ल के लिए विकल्प हैं। "-T" is tainting (इसका मतलब है कि इनपुट को "विश्वसनीय नहीं" के रूप में चिह्नित किया जाता है जब तक आप इसे प्रारूप में नहीं देखते)। "-w" चेतावनियां चालू करता है।

आप perldoc perlrun चलाकर और अधिक जानकारी प्राप्त कर सकते हैं (Perldoc पर्ल का प्रलेखन पाठक है, स्थापित हो सकता है, अपने पैकेज में हो सकता है)।

स्क्रिप्ट के लिए आप लिखना मैं उनके साथ शुरू करने की सिफारिश करेंगे:

#!/usr/bin/perl 
use warnings; 
use strict; 

यह और चेतावनी के बहुत सारे अतिरिक्त चेक पर बदल जाता है - विशेष रूप से उपयोगी आप सीख रहे हैं, जबकि (मैं अभी भी सीख रहा हूँ और मैं का उपयोग कर अब 10 से अधिक वर्षों के लिए पर्ल)।

+0

यहां एक प्रश्न है। जब मुझे #!/Usr/bin/perl -T वाली फ़ाइल में एक और .pl फ़ाइल की आवश्यकता होती है, तो यह त्रुटि फेंकता है। और जब मैं हटा देता हूं, यह चलता है। क्या कारण है? धन्यवाद। – vijay

2

इसे शेबांग कहा जाता है। यूनिक्स आधारित सिस्टम (ओएसएक्स, लिनक्स, इत्यादि ...) पर वह लाइन भाषा दुभाषिया के पथ को इंगित करती है जब स्क्रिप्ट कमांड लाइन से चलती है। पर्ल/usr/bin/perl के मामले में पर्ल दुभाषिया का मार्ग है। यदि हैशबैंग को छोड़ दिया गया है * निक्स सिस्टम निष्पादन योग्य के रूप में बुलाए जाने पर स्क्रिप्ट को पार्स करने का तरीका नहीं जानेंगे। इसके बजाय यह स्क्रिप्ट को समझने की कोशिश करेगा कि उपयोगकर्ता जो भी खोलने वाला होता है (शायद बाश) और स्क्रिप्ट को तोड़ देता है।

http://en.wikipedia.org/wiki/Hashbang

डब्ल्यू और -टी तर्क है कि जिस तरह से पर्ल दुभाषिया संचालित नियंत्रित कर रहे हैं। वे वही तर्क हैं जिन्हें आप सीधे कमांड लाइन से पर्ल दुभाषिया को कॉल करते समय आह्वान कर सकते हैं।

  • -W चेतावनियां दिखाता है (उर्फ डीबगिंग जानकारी)।
  • -T दंड/सुरक्षा जांच चालू करता है।
5

-w और -T दोनों "मूर्खतापूर्ण" झंडे हैं।

-w आपके कोड में use warning स्टेटमेंट जैसा ही है, और यह कई कंप्यूटर्स में चेतावनी विकल्प के बराबर है।

#!/usr/bin/perl -w 
print "$A\n"; 
print "Hello, world!\n"; 

प्रिंट होगा:: एक सरल उदाहरण अप्रारंभीकृत चर का उपयोग कर के बारे में चेतावनी होगा

Name "main::A" used only once: possible typo at ./perl-warnings line 3. 
Use of uninitialized value $A in concatenation (.) or string at 
./perl-warnings line 3. 

Hello, world! 

-T झंडा मतलब यह है कि किसी भी मूल्य है कि बाहर की दुनिया से अंदर गणना की जा रही के लिए आया था (विपरीत के रूप में कार्यक्रम) संभावित खतरे के रूप में माना जाता है, और सिस्टम से संबंधित संचालन, जैसे फाइल लिखने, सिस्टम कमांड निष्पादित करने आदि जैसे मानों का उपयोग अस्वीकार करता है (यही कारण है कि पर्ल सेटिड/सेटगिड के तहत चल रही है जब पर्ल "टेंट" मोड को सक्रिय करेगा।)

स्क्रिप्ट के अंदर मान को दोबारा जांचने के लिए "दांतेदार" मोड "लागू" है।

जैसे, कोड:

#!/usr/bin/perl -T 
$A = shift; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

एक गंभीर त्रुटि का उत्पादन होगा (कार्यक्रम समाप्त):

$ ./perl-tainted jkjk 
Insecure dependency in open while running with -T switch at 
./perl-tainted line 3. 

और वह केवल इसलिए है क्योंकि तर्क मूल्य "बाहर" से आया है और नहीं था " दो बार जांच की गई"। "दांत" मोड उस तथ्य पर आपका ध्यान खींच रहा है। बेशक, इसे बेवकूफ बनाना आसान है, उदाहरण:

#!/usr/bin/perl -T 
$A = shift; 
$A = $1 if $A =~ /(^.*$)/; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

इस मामले में सब ठीक काम किया। आपने "दांत मोड" को "मूर्ख" किया। खैर, धारणा यह है कि प्रोग्रामर का इरादा कार्यक्रम को सुरक्षित बनाना है, इसलिए प्रोग्रामर सिर्फ त्रुटि के आसपास काम नहीं करेगा, बल्कि कुछ सुरक्षा उपायों को लेगा। पर्ल के प्रचलित नामों में से एक "सिस्टम प्रशासकों का गोंद और नली टेप" है। यह असंभव नहीं है कि सिस्टम प्रशासक अपनी जरूरतों के लिए पर्ल स्क्रिप्ट तैयार करेगा और इसे root अनुमतियों के साथ चलाएगा। इस स्क्रिप्ट के बारे में सोचें कि कुछ सामान्य उपयोगकर्ताओं को करने की अनुमति नहीं है ... आप शायद उन चीजों को दोबारा जांचना चाहते हैं जो प्रोग्राम का हिस्सा नहीं हैं, और आप चाहते हैं कि पर्ल आपको उनके बारे में याद दिलाना चाहें।

उम्मीद है कि यह मदद करता है।

+2

'-w' 'चेतावनियों का उपयोग' जैसा नहीं है;'। प्रज्ञा स्पष्ट रूप से स्कॉप्ड है। – friedo

+2

"-w उपयोग चेतावनी के समान है"। यह बिल्कुल सही नहीं है। -W चेतावनी हमेशा चालू करता है ($^डब्ल्यू या कोई चेतावनी को अनदेखा कर रहा है), -वह चेतावनियां चालू करता है, सिवाय इसके कि जब $^डब्ल्यू 0 पर सेट हो या कोई चेतावनी का उपयोग नहीं किया जाता है। "चेतावनियों का उपयोग करें" lexically scoped है। – tinita

3

कलंक मोड (-टी) के बारे में:
require और use बयान बदल जब कलंक मोड चालू है।
लाइब्रेरी/मॉड्यूल लोड करने का पथ अब इसके पथ से . (वर्तमान निर्देशिका) नहीं है।

तो यदि आप पथ को स्पष्ट रूप से निर्दिष्ट किए बिना वर्तमान कार्य निर्देशिका के सापेक्ष किसी भी पुस्तकालय या मॉड्यूल लोड करते हैं, तो आपकी स्क्रिप्ट खराब मोड के नीचे टूट जाएगी।

पूर्व के लिए: विचार करें perl_taint_ex.pl

#!/usr/bin/perl -T 

require "abc.pl"; 
print "Done"; 

इस

D:\perlex>perl perl_taint_ex.pl 
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl 
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib) 
at perl_taint_ex.pl line 3. 

तरह विफल हो जाएगा तो जब कलंक मोड पर है, तो आप बयान की आवश्यकता स्पष्ट रूप से जहां लोड करने के लिए बताना होगा . से लाइब्रेरी @INC सरणी से रंग मोड के दौरान हटा दी गई है।

@INC में पुस्तकालय फ़ाइलों और मॉड्यूल पढ़ने के लिए वैध पथों की एक सूची है।

तो कलंक मोड पर है, तो आप बस निम्नलिखित करना होगा:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl 
Done 

-ID:\perlex@INC में निर्देशिका D:\perlex शामिल होंगे।

आप @INC पर पथ जोड़ने के अन्य तरीकों का प्रयास कर सकते हैं, यह केवल एक उदाहरण है।

+0

यह स्पष्टीकरण क्या होता है यदि आप कमांडलाइन से -T पैरामीटर का सही ढंग से उपयोग नहीं करते हैं, लेकिन एक पर्ल स्क्रिप्ट की शेबैंग लाइन में निर्दिष्ट करते हैं तो क्या होता है इसका एक अच्छा स्पष्टीकरण प्रदान करता है। उपयोगी। – pdwalker

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