Perl bayrakları -pe, -pi, -p, -w, -d, -i, -t?


107

Perl kodunu veya komut dosyalarını farklı bayraklarla çalıştırmanın birçok yolunu gördüm. Bununla birlikte, her bir bayrağın ne anlama geldiğini google'da aradığımda, esas olarak genel Perl sitelerine sonuç alıyorum ve bayraklarla veya bunların kullanımıyla ilgili belirli bir bilgi bulunamıyor.

Aşağıda en sık karşılaştığım bayraklar var ve ne anlama geldiklerine dair hiçbir fikrim yok:

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

Bunların her birinin ne anlama geldiğini ve bazılarının onlar için kullanım durumlarını bana söylerseniz ya da en azından bana anlamlarını bulmanın bir yolunu söylerseniz çok minnettar olacağım.


21
perl ile ilgili temel yanıtlar için googling yapmak sizi çoğu zaman gerçekten yardımcı olmayan sitelere yönlendirir. her zaman önce Perl'in kendi belgelerine bakın.
ysth


3
Görevlendirildi. Bu durumda, perldoc perlrunPerl'in kabul ettiği tüm komut satırı seçeneklerinin bir listesi vardır.
Sherm Pendley

1
Google sorunu: Eksi işareti Google tarafından "bu terimi hariç tut" olarak yorumlanıyor. Bu davranıştan kaçınmak için eksi işaretini içeren terimi tırnak içine yerleştirin.
Roger Krueger

Yanıtlar:


147

Evet, Google noktalama ararken ve maalesef Perl için çok zordur gelmez çoğunlukla yukarı noktalama yapılmış gibi görünüyor :-)

Komut satırı anahtarlarının tümü perlrun'da ayrıntılı olarak açıklanmıştır . (çağrı ile komut satırından ulaşılabilir perldoc perlrun)

Seçeneklere kısaca teker teker girersek:

-p: Komutunuzun etrafına bir yazdırma döngüsü yerleştirir, böylece her bir
    standart giriş hattı. Çoğunlukla Perl'in
    güç VE basitlik açısından awk pantolon :-)
-n: Komutunuzun etrafına yazdırılmayan bir döngü yerleştirir.
-e: Programı argüman olarak sağlamanıza izin verir.
    bir dosyadakinden daha fazla. Senaryo oluşturmak zorunda kalmak istemezsin
    her küçük Perl tek satırlık dosya.
-i: Girdi dosyanızı yerinde değiştirir (
    orijinal). Dosyaları {copy,
    orijinali sil, yeniden adlandır} işlemi.
-w: Bazı uyarıları etkinleştirir. Herhangi bir iyi Perl kodlayıcı bunu kullanacaktır.
-d: Perl hata ayıklayıcı altında çalışır. Perl kodunuzda hata ayıklamak için,
    belli ki.
-t: Belirli "bozuk" (şüpheli) kodları uyarı olarak değerlendirir (uygun
    Bozukluk modu bu şüpheli kodda hata verecektir). Sığır eti için kullanılır
    Perl güvenliğini artırın, özellikle de diğerleri için kod çalıştırırken
    setuid komut dosyaları veya web öğeleri gibi kullanıcılar.

1
Bahsettiğini fark etmedim perldoc perlrun. Cevabımı sildim. :-)
Alan Haggai Alavi

4
-wAslında, uyarılar akılda tutularak yazılmamış CPAN modülleri dahil olmak üzere tüm kodlar için uyarılar sağladığından, genellikle kaçınılmalıdır . Sonuçlar genellikle oldukça gürültülü ve işe yaramaz.
duskwuff -inaktif-

9
-wgenellikle önlenir, ancak use warningskendi kodunuzda ile değiştirilmelidir .
plusplus

6
@duskwuff: Genel olarak kabul ediyorum ve use warningskendi kodumda yapıyorum , ancak -w'nin bir faydası var - kötü yazılmış CPAN modüllerini ayıklamaya yardımcı oluyor. :-)
Sherm Pendley

2
@IanBytchek Ek bir parametre alabilecek / alması gereken bağımsız değişkenler sıkıştırılmış bir listenin içinde olamaz. -iyedekleme için bir uzantı alır. -ebir perl komutu alır. Gelen -0ep sen Perl anlatıyorsun 'p' yerine bağımsız değişken bir perl komut olduğunu. Bu hiç iyi sonuç vermeyecek.
tjd

10

-pBayrak temelde senaryoyu ile çalışır

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

-e bir komut dosyasını bir STDIN

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

-iyorumlayıcıya STDIN, yürütme betiği tarafından iletilen tüm verilerin yerinde yapılacağını yönlendirir.

-wile aynıdır use warnings;, ancak yerel değil küresel kapsamda

-d Perl hata ayıklayıcısını çalıştırır


2
-wtam olarak aynı değil use warnings, ikincisi yerel dosya kapsamındadır
artı artı

artı artı, doğru, yama yanıtı.
zellio

2
Komut dosyasını bağımsız değişken olarak geçirmek, onu STDIN'e geçirmekle aynı şey değildir. -i dosya isimlerini stdin değil argüman listesinden alır. STDIN genellikle kontrol eden uçbirimle ilişkilendirilirken ve stdin okuyan ve argüman listesini perl olarak ayarlayan kabuktan miras alınsa da, bunlar aynı şey DEĞİLDİR.
William Pursell

8

Diğerleri perlrun'dan bahsetti. B :: Deparse kullanırsanız, bunun ne anlama geldiğini görebilirsiniz (çoğu şey için):

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

1, '???' ile temsil edilir, çünkü optimize edilmiştir.

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

-i $ ^ ı belirler, şöyle

$ 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

Ancak, <ARGV> 'nin 2 bağımsız değişkenli açık kullandığını unutmayın, bu nedenle ile başlayan > <veya ile başlayan / biten dosya adlarına sahip olmayın |.


4

-nListede belirtilmeyen önemli bir bayrak da var.

-naynı şekilde çalışır -p, yalnızca $_varsayılan olarak yazdırmaz . Bu, metin dosyalarını filtrelemek için çok yararlı olabilir.

Bu şekilde Perl, grep | sedtek bir astar ile değiştirilebilir.

Örneğin:

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

"Mesajlar okundu:" dan sonra bulunan her tamsayı değerini yazdırır ve başka bir şey yazmaz.


Bu daha da basitleştirilebilir. "$ 1 \ n" yazdırmaya gerek yok. Bunun yerine "yazdır" kullanabilirsiniz.
yiyen elysium

Hayır, yapamaz, ( ) ile print $1aynı değildir . printprint $_
rustyx

Yapabilir: echo abc | perl -nw -e "print if (1)"yazdıracaktır abc. $1Referansa gerek yok .
elysium yiyip

@devouredelysium: Evet, ancak tüm satırı yazdırmak istemiyor, yalnızca normal ifadeyle eşleşen sayıyı yazdırmak istiyor.
Ingo Blechschmidt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.