2012-06-29 6 views
7

Użyłem go pod numerem #!/usr/bin/perl, ale nie znalazłem zadowalającej odpowiedzi. Wiem, że to dość podstawowa rzecz, ale czy mogę wyjaśnić, jakie jest znaczenie Perl? Co ponadto oznacza -w lub -T w ? Jestem początkującym perłem, więc proszę o cierpliwość.Jakie jest znaczenie opcji -T lub -w w #!/Usr/bin/perl?

+2

'#!/Usr/bin/perl' nazywa się linią shebang. '-w" dla ostrzeżeń "-T" dla trybu Taint. –

+4

'-w' nie było zalecane od wielu lat. Od wersji Perl 5.6.0 mieliśmy "używać ostrzeżeń", które są bardziej wydajne i bardziej elastyczne. –

Odpowiedz

13

#! jest powszechnie nazywane "shebang" i informuje komputer, jak uruchomić skrypt. Zobaczysz także wiele skryptów powłoki z #!/bin/sh lub #!/bin/bash.

Tak więc, /usr/bin/perl to Twój interpreter Perla, który jest uruchamiany i otrzymuje plik do wykonania.

Reszta wiersza to opcje dla Perla. "-T" is tainting (oznacza to, że dane wejściowe są oznaczone jako "niezaufane", dopóki nie sprawdzisz ich formatu). "-w" włącza ostrzeżenia.

Możesz dowiedzieć się więcej, uruchamiając perldoc perlrun (perldoc to czytnik dokumentacji Perla, może być zainstalowany, może być w swoim pakiecie).

Dla skryptów piszesz Polecam zaczynając je:

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

Włącza wielu ostrzeżeń i dodatkowych kontroli - szczególnie przydatne podczas uczenia się (wciąż się uczę i używam Perl od ponad 10 lat).

+0

Oto zapytanie. Kiedy wymagam innego pliku .pl do pliku posiadającego #!/Usr/bin/perl -T, generuje on błąd. A kiedy usuwam -T, działa. Co jest przyczyną? Dzięki. – vijay

2

To się nazywa shebang. W systemach opartych na Uniksie (OSX, Linux, itp.) Linia ta wskazuje ścieżkę do interpretera języka, gdy skrypt uruchamiany jest z wiersza poleceń. W przypadku perl/usr/bin/perl jest to ścieżka do interpretera perl. Jeśli hashbang zostanie pominięty, systemy * nix nie będą wiedziały, jak przeanalizować skrypt, gdy zostanie wywołany jako plik wykonywalny. Zamiast tego spróbuje zinterpretować skrypt w dowolnej powłoce uruchomionej przez użytkownika (prawdopodobnie bash) i przerwać skrypt.

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

-W i -T są argumenty, że Controll drogę interpreter perla działa. Są to te same argumenty, które można wywołać podczas wywoływania interpretera perla bezpośrednio z wiersza poleceń.

  • -W wyświetla ostrzeżenia (również informacje dotyczące debugowania).
  • -T włącza sprawdzanie zabrudzenia/bezpieczeństwa.
5

Zarówno -w, jak i -T są rodzajem "niezawodnych" flag.

-w jest tym samym, co use warning w swoim kodzie, i jest odpowiednikiem opcji ostrzegania w wielu kompilatorach.Najprostszym przykładem może być ostrzeżenie o użyciu niezainicjowanej zmiennej:

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

wypisze:

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 flaga oznacza, że ​​każda wartość, która pochodzi od świata zewnętrznego (jako przeciwieństwo do oblicza wewnątrz program) jest uważane za potencjalne zagrożenie i uniemożliwia użycie takich wartości w operacjach związanych z systemem, takich jak zapisywanie plików, wykonywanie poleceń systemowych itp. (Dlatego właśnie Perl aktywowałby tryb "taint", gdy skrypt działa pod ustawieniem setuid/setgid.)

Tryb "skażony" polega na "wymuszeniu" podwójnego sprawdzenia wartości w skrypcie.

Eg, kod:

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

będzie produkować błąd krytyczny (zakończenie programu):

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

I to tylko dlatego, że wartość argumentu pochodziła z „zewnątrz” i nie było " dwukrotnie sprawdzony ". Tryb "taint" zwraca twoją uwagę na ten fakt. Oczywiście łatwo go oszukać, np .:

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

W tym przypadku wszystko działało dobrze. Oszukujesz "tryb skażenia". Założeniem jest, że intencją programisty jest uczynienie programu bezpieczniejszym, aby programista nie popracował nad błędem, ale wolałby podjąć pewne środki bezpieczeństwa. Jednym z pseudonimów Perla jest "klej i taśma klejąca dla administratorów systemu". Jest mało prawdopodobne, że administrator systemu utworzyłby skrypt Perla dla własnych potrzeb i uruchomiłby go z uprawnieniami root. Pomyśl o tym scenariuszu, robiąc coś, czego zwykli użytkownicy nie mogą robić ... prawdopodobnie chcesz dokładnie sprawdzić rzeczy, które nie są częścią samego programu, i chcesz, aby Perl przypomniał Ci o nich.

Mam nadzieję, że to pomaga.

+2

'-w' to nie to samo, co' use warning; '. Pragma ma zasięg leksykalny. – friedo

+2

o "-w to to samo co ostrzeżenie użycia". to nie jest dokładnie poprawne. -W włącza ostrzeżenia w dowolnym miejscu (ignorując $^W lub bez ostrzeżeń), -w włącza ostrzeżenia w dowolnym miejscu z wyjątkiem sytuacji, gdy $^W jest ustawione na 0 lub nie są używane żadne ostrzeżenia. "use warning" ma charakter leksykalny. – tinita

3

o skaza trybie (-T):
require i use wypowiedzi zmienia się, gdy tryb skaza jest włączony.
Ścieżka do ładowania bibliotek/modułów nie zawiera już ścieżki . (bieżącego katalogu).

Jeśli więc załadujesz biblioteki lub moduły w odniesieniu do bieżącego katalogu roboczego bez jawnego określenia ścieżki, skrypt zostanie przerwany w trybie taint.

Dla ex: Rozważmy perl_taint_ex.pl

#!/usr/bin/perl -T 

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

zawiedzie się ten

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. 

Więc kiedy tryb skaza jest na, trzeba powiedzieć wyraźnie, gdzie oświadczenie wymaga załadowania biblioteka od . została usunięta podczas trybu taint z tablicy @INC.

@INC zawiera listę prawidłowych ścieżek do odczytywania plików i modułów biblioteki.

Jeśli tryb skaza jest, byś po prostu wykonaj następujące czynności:

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

-ID:\perlex obejmie katalogu D:\perlex w @INC.

Możesz wypróbować inne sposoby dodawania ścieżki do @INC, to tylko jeden przykład.

+0

To wyjaśnienie dostarcza dobrego wyjaśnienia tego, co się stanie, jeśli nie użyjesz poprawnie parametru -T z wiersza poleceń, ale podasz go w wierszu shebang skryptu perl. Przydatny. – pdwalker

Powiązane problemy