Bendera Perl -pe, -pi, -p, -w, -d, -i, -t?

107

Saya telah melihat banyak cara menjalankan kode Perl atau script, dengan flag yang berbeda. Namun, ketika saya mencoba Google untuk mengetahui arti setiap bendera, saya terutama mendapatkan hasil ke situs Perl generik dan tidak ada informasi khusus mengenai bendera atau penggunaannya ditemukan di sana.

Di bawah ini adalah bendera yang paling sering saya temui, dan saya tidak tahu apa artinya:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

Saya akan sangat berterima kasih jika Anda memberi tahu saya apa arti masing-masing dari itu dan beberapa kasus penggunaan untuk mereka, atau setidaknya memberi tahu saya cara untuk mencari tahu artinya.

Tudor Constantin
sumber
21
Googling untuk jawaban dasar tentang perl akan sering membawa Anda ke beberapa situs yang sangat tidak membantu. selalu periksa dokumentasi perl sendiri terlebih dahulu.
ysth
2
Dibantu. Dalam hal ini, perldoc perlrunmemiliki daftar semua opsi baris perintah yang diterima Perl.
Sherm Pendley
1
Masalah Google: Tanda minus ditafsirkan oleh Google sebagai "kecualikan istilah ini". Untuk menghindari perilaku ini tempatkan istilah yang mengandung tanda minus dalam tanda kutip.
Roger Krueger

Jawaban:

147

Ya, Google terkenal sulit untuk mencari tanda baca dan, sayangnya, Perl tidak tampaknya sebagian besar terdiri dari tanda baca :-)

Semua saklar baris perintah diperinci dalam perlrun . (tersedia dari baris perintah dengan menelepon perldoc perlrun)

Masuk ke opsi secara singkat, satu per satu:

-p: Menempatkan loop pencetakan di sekitar perintah Anda sehingga berfungsi pada masing-masing perintah
    garis input standar. Sebagian besar digunakan agar Perl dapat mengalahkan file
    canggung dalam hal kekuatan DAN kesederhanaan :-)
-n: Menempatkan loop non-pencetakan di sekitar perintah Anda.
-e: Memungkinkan Anda untuk menyediakan program sebagai argumen
    daripada di file. Anda tidak ingin harus membuat skrip
    file untuk setiap Perl satu baris kecil.
-i: Memodifikasi file input Anda di tempat (membuat cadangan file
    asli). Berguna untuk mengubah file tanpa {copy,
    delete-original, rename} proses.
-w: Mengaktifkan beberapa peringatan. Pembuat kode Perl yang baik akan menggunakan ini.
-d: Berjalan di bawah debugger Perl. Untuk men-debug kode Perl Anda,
    jelas.
-t: Memperlakukan kode tertentu yang "tercemar" (meragukan) sebagai peringatan (sesuai
    mode noda akan error pada kode yang meragukan ini). Dulu daging sapi
    up keamanan Perl, terutama saat menjalankan kode untuk lainnya
    pengguna, seperti skrip setuid atau barang web.
paxdiablo
sumber
1
Saya tidak memperhatikan yang Anda maksud perldoc perlrun. Saya telah menghapus jawaban saya. :-)
Alan Haggai Alavi
4
-wpada umumnya harus dihindari, sebenarnya, karena ini mengaktifkan peringatan untuk semua kode, termasuk modul CPAN yang tidak ditulis dengan peringatan dalam pikiran. Hasilnya umumnya cukup berisik, dan juga sangat tidak berguna.
senja -tidak aktif-
9
-wumumnya dihindari, tetapi harus diganti dengan use warningskode Anda sendiri.
plusplus
6
@duskwuff: Secara umum saya setuju, dan saya melakukannya use warningsdengan kode saya sendiri, tetapi -w memang berguna - ini membantu menyingkirkan modul CPAN yang ditulis dengan buruk. :-)
Sherm Pendley
2
@IanBytchek Argumen yang mungkin / harus mengambil parameter tambahan tidak boleh berada di dalam daftar terkompresi. -imengambil ekstensi untuk cadangan. -emengambil perintah perl. Jika -0ep Anda memberi tahu perl bahwa 'p' adalah perintah perl, bukan argumen. Itu tidak akan berhasil sama sekali.
tjd
10

The -pbendera pada dasarnya menjalankan script dengan

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e memungkinkan Anda meneruskan skrip ke STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-imengarahkan penerjemah bahwa semua data yang diteruskan STDINoleh skrip pelaksana harus dilakukan di tempat.

-wsama use warnings;, tetapi dalam lingkup global daripada lokal

-d menjalankan debugger Perl

zellio
sumber
2
-wtidak persis sama dengan use warnings, yang terakhir dicakup ke file lokal
plusplus
plusplus, benar, jawaban patching.
zellio
2
Meneruskan skrip sebagai argumen tidak sama dengan meneruskannya di STDIN. -i mengambil nama file dari daftar argumen, bukan stdin. Sementara STDIN sering dikaitkan dengan terminal pengendali, dan diwarisi dari shell yang membaca stdin dan mengatur daftar argumen ke perl, mereka BUKAN hal yang sama.
William Pursell
8

Yang lain menyebutkan perlrun. Jika Anda menggunakan B :: Deparse, Anda dapat melihat artinya (untuk banyak hal):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 diwakili oleh '???', karena ini dioptimalkan.

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-Aku menetapkan $ ^ Aku, suka

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Tapi ingat, <ARGV> menggunakan 2-argumen terbuka, jadi jangan memiliki nama file yang diawali dengan > <atau diawali / diakhiri dengan |.

liame
sumber
4

Ada juga satu flag penting -nyang tidak disebutkan dalam daftar.

-nberfungsi sama seperti -p, hanya saja tidak mencetak $_secara default. Ini bisa sangat berguna dalam memfilter file teks.

Dengan cara ini Perl dapat menggantikannya grep | seddalam satu baris tunggal.

Sebagai contoh:

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Akan mencetak setiap nilai integer yang ditemukan setelah "Pesan dibaca:", dan tidak lebih.

rustyx.dll
sumber
Ini dapat lebih disederhanakan. Tidak perlu "mencetak" $ 1 \ n "". Anda bisa menggunakan "print" saja.
melahap elysium
Tidak, tidak bisa, print $1tidak sama dengan print( print $_).
rustyx
Itu bisa: echo abc | perl -nw -e "print if (1)"akan mencetak abc. Tidak perlu $1referensi.
melahap elysium
@devouredelysium: Ya, tetapi tidak ingin mencetak seluruh baris, tetapi hanya nomor yang cocok dengan ekspresi reguler.
Ingo Blechschmidt