Wiem, że możesz użyć operatora testu pliku -B do sprawdzenia, czy plik jest binarny, ale w jaki sposób Perl implementuje go wewnętrznie?W jaki sposób Perl wie, że plik jest binarny?
16
A
Odpowiedz
26
Od perldoc -f -B
:
Prace-T
i-B
przełączniki następująco. Pierwszy blok lub , tak więc plik jest sprawdzany pod kątem nieparzystych znaków, takich jak dziwne kody sterujące lub znaki z ustawionym wysokim bitem. Jeśli zostanie znalezionych zbyt wiele dziwnych znaków (> 30%), jest to plik-B
; w przeciwnym razie jest to plik-T
. Ponadto każdy plik zawierający wartość null w pierwszy blok jest traktowany jako plik binarny. Jeśli na uchwycie pliku używany jest-T
lub-B
, bieżący bufor IO jest badany raczej jako niż pierwszy blok. Zarówno-T
, jak i-B
zwracają true przy pliku zerowym lub pliku o numerzeEOF
podczas testowania uchwytu pliku. Ponieważ musisz przeczytać plik, aby wykonać test-T
, w większości przypadków chcesz najpierw użyć pliku-f
w stosunku do pliku, jak w "next unless -f $file && -T $file
".
10
Zgodnie z rozdziałem 11 książki Learning Perl:
odpowiedź brzmi ** Perl oszukuje **: otwiera plik, wygląda na pierwszych kilku tysięcy bajtów, i sprawia, zgaduje . Jeśli widzi wiele pustych bajtów, nietypowych znaków kontrolnych i bajtów z ustawionym wysokim bitem, to wygląda jak plik binarny. Jeśli nie ma zbyt wiele dziwnych rzeczy, to wygląda na tekst. Czasami domysły są błędne. Jeśli plik tekstowy zawiera dużo szwedzkich lub francuskich słów (które mogą mieć znaki reprezentowane z ustawionym wysokim bitem, jak niektóre ISO-8859 - coś w tym wariancie, a może nawet w wersji Unicode), może oszukać Perla w deklarowaniu binarnym. Więc nie jest idealny, ale jeśli potrzebujesz oddzielić swój kod źródłowy od skompilowanych plików lub plików HTML od PNG, te testy powinny załatwić sprawę.
Powiązane problemy
- 1. W jaki sposób czytnik RSS wie, że kanał jest aktualizowany?
- 2. W jaki sposób C# wie, jaki jest typ literału?
- 3. Powiedz, że plik tekstowy jest w rzeczywistości binarny
- 4. W jaki sposób bios wie, jaki rodzaj BPB jest obecny?
- 5. W jaki sposób Python wie, że blok kodu jest w pętli?
- 6. Dlaczego git zdecydować, że mój plik jest binarny
- 7. W jaki sposób fread wie, kiedy plik kończy się w C?
- 8. W jaki sposób agent Konsula wie, że jest on liderem klastra?
- 9. W jaki sposób program Visual Studio wie, czy plik źródłowy jest zgodny z oryginalną wersją?
- 10. W jaki sposób Perl unika pętli shebang?
- 11. Jaki jest najlepszy sposób, aby upewnić się, że działa tylko jedna instancja programu Perl?
- 12. W jaki sposób Chocolatey wie, które pakiety są zainstalowane lokalnie?
- 13. W jaki sposób kompilator wie, który blok catch ma wykonać?
- 14. W jaki sposób wyrażenie LINQ wie, że Where() występuje przed Select()?
- 15. W jaki sposób ZAK wie, że aplikacja będzie wymagać podwyższonych uprawnień?
- 16. W jaki sposób strona wie, że analizuję ją za pomocą firebuga?
- 17. Odczytaj plik binarny do tablicy
- 18. W jaki sposób Java wie jak modyfikować tablicę?
- 19. W jaki sposób Bundler wie, z jakiego środowiska korzystać?
- 20. Jak scalić plik binarny?
- 21. W jaki sposób CBPeripheralManager wie, że jest on podłączony lub rozłączony przez urządzenie centralne w Core Bluetooth?
- 22. W jaki sposób Apache Spark wie o węzłach danych HDFS?
- 23. W jaki sposób proces node.js wie, kiedy należy zatrzymać?
- 24. w jaki sposób activerecord wie, jak wykonać wstawianie lub aktualizację?
- 25. W jaki sposób malloc() wie, gdzie zaczyna się hałda?
- 26. Jak sprawdzić, czy plik jest binarny?
- 27. W jaki sposób poinformować kręgosłupa, że model nie jest nowy
- 28. plik binarny ciąg
- 29. W jaki sposób można upewnić się, że plik wykonywalny jest otwierany za pomocą innego pliku wykonywalnego?
- 30. W jaki sposób skrypt bash może zapisać plik binarny bez użycia uudecode?
Istnieje możliwość użycia magicznego znaku cache statystycznego "_": "następny, chyba że -f $ plik i -T _" –