Perl cờ -pe, -pi, -p, -w, -d, -i, -t?


107

Tôi đã thấy rất nhiều cách chạy mã Perl hoặc tập lệnh, với các cờ khác nhau. Tuy nhiên, khi tôi cố gắng tìm kiếm ý nghĩa của mỗi lá cờ, tôi chủ yếu nhận được kết quả từ các trang Perl chung chung và không tìm thấy thông tin cụ thể nào về các lá cờ hoặc việc sử dụng chúng ở đó.

Dưới đây là những lá cờ mà tôi gặp thường xuyên nhất và tôi không biết ý nghĩa của chúng:

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

Tôi sẽ rất biết ơn nếu bạn cho tôi biết ý nghĩa của mỗi từ đó và một số trường hợp sử dụng đối với chúng, hoặc ít nhất là cho tôi biết cách tìm ra ý nghĩa của chúng.


21
googling cho các câu trả lời cơ bản về perl thường sẽ dẫn bạn đến một số trang web thực sự không hữu ích. luôn luôn kiểm tra tài liệu riêng của perl trước.
ysth


2
Biệt phái. Trong trường hợp này, perldoc perlruncó một danh sách tất cả các tùy chọn dòng lệnh mà Perl chấp nhận.
Sherm Pendley

1
Vấn đề của Google: Dấu trừ được Google hiểu có nghĩa là "loại trừ thuật ngữ này". Để tránh hành vi này, hãy đặt thuật ngữ có chứa dấu trừ trong dấu ngoặc kép.
Roger Krueger

Câu trả lời:


147

Vâng, Google là vô cùng khó khăn cho nhìn lên dấu chấm câu và, thật không may, Perl không có vẻ là chủ yếu tạo thành dấu chấm câu :-)

Tất cả các công tắc dòng lệnh đều được trình bày chi tiết trong perlrun . (có sẵn từ dòng lệnh bằng cách gọi perldoc perlrun)

Đi vào các tùy chọn một cách ngắn gọn, từng cái một:

-p: Đặt một vòng lặp in xung quanh lệnh của bạn để nó hoạt động trên từng
    dòng đầu vào tiêu chuẩn. Được sử dụng chủ yếu để Perl có thể đánh bại
    quần tắt awk về sức mạnh VÀ sự đơn giản :-)
-n: Đặt một vòng lặp không in xung quanh lệnh của bạn.
-e: Cho phép bạn cung cấp chương trình dưới dạng đối số
    hơn trong một tệp. Bạn không muốn phải tạo một tập lệnh
    tập cho mỗi Perl một lớp lót nhỏ.
-i: Sửa đổi tệp đầu vào của bạn tại chỗ (tạo bản sao lưu của
    nguyên). Tiện dụng để sửa đổi tệp mà không cần {copy,
    quá trình xóa-gốc, đổi tên}.
-w: Kích hoạt một số cảnh báo. Bất kỳ coder Perl giỏi sẽ sử dụng điều này.
-d: Chạy trong trình gỡ lỗi Perl. Để gỡ lỗi mã Perl của bạn,
    chắc chắn.
-t: Coi một số mã "nhiễm bẩn" (không rõ ràng) là cảnh báo (thích hợp
    chế độ mờ sẽ lỗi trên mã đáng ngờ này). Dùng để làm thịt bò
    tăng cường bảo mật Perl, đặc biệt là khi chạy mã cho
    người dùng, chẳng hạn như tập lệnh setuid hoặc nội dung web.

1
Tôi không nhận thấy rằng bạn đã giới thiệu perldoc perlrun. Tôi đã xóa câu trả lời của mình. :-)
Alan Haggai Alavi

4
-wNói chung là cần tránh, thực sự, vì nó cho phép cảnh báo cho tất cả mã, bao gồm cả các mô-đun CPAN không được viết với cảnh báo. Kết quả nói chung là khá ồn ào, cũng như khá vô dụng.
duskwuff -inactive-

9
-wnói chung là tránh, nhưng nó nên được thay thế bằng use warningsmã của riêng bạn.
plusplus

6
@duskwuff: Nói chung, tôi đồng ý và tôi làm use warningstrong mã của riêng mình, nhưng -w thì có cách sử dụng - nó giúp loại bỏ các mô-đun CPAN viết kém. :-)
Sherm Pendley

2
@IanBytchek Các đối số có thể / phải có tham số bổ sung không được nằm trong danh sách nén. -icó một phần mở rộng để sao lưu. -enhận một lệnh perl. Trong -0ep bạn đang nói với perl rằng 'p' là một lệnh perl thay vì một đối số. Điều đó sẽ không diễn ra tốt đẹp chút nào.
tjd

10

Các -p lá cờ về cơ bản chạy kịch bản với

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

-e cho phép bạn chuyển một tập lệnh tới STDIN

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

-ihướng dẫn trình thông dịch rằng tất cả dữ liệu được chuyển đến STDINbởi tập lệnh đang thực thi phải được thực hiện tại chỗ.

-w giống như use warnings; , nhưng trong phạm vi toàn cầu thay vì phạm vi cục bộ

-d chạy trình gỡ lỗi Perl


2
-wlà không hoàn toàn giống như use warnings, sau này có phạm vi đến tập tin địa phương
PlusPlus

plusplus, đúng, câu trả lời vá lỗi.
zellio

2
Truyền tập lệnh làm đối số không giống như truyền nó trên STDIN. -i lấy tên tệp từ danh sách đối số, không phải stdin. Mặc dù STDIN thường được liên kết với thiết bị đầu cuối điều khiển và được kế thừa từ trình bao đọc stdin và thiết lập danh sách đối số thành perl, chúng KHÔNG giống nhau.
William Pursell

8

Khác đã đề cập đến perlrun. Nếu bạn sử dụng B :: Deparse, bạn có thể thấy ý nghĩa của nó (đối với hầu hết mọi thứ):

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

1 được biểu thị bằng '???', vì nó được tối ưu hóa.

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

-i đặt $ ^ I, like

$ 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

Nhưng hãy nhớ rằng, <ARGV> sử dụng mở 2 đối số, do đó, không có tên tệp bắt đầu bằng > <hoặc bắt đầu / kết thúc bằng |.


4

Ngoài ra còn có một lá cờ quan trọng -nkhông được đề cập trong danh sách.

-nhoạt động giống như -p, chỉ là nó không in $_theo mặc định. Điều này có thể rất hữu ích trong việc lọc các tệp văn bản.

Bằng cách này Perl có thể thay thế grep | sedbằng một lớp lót duy nhất.

Ví dụ:

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

Sẽ in ra mọi giá trị số nguyên được tìm thấy sau "Tin nhắn đã đọc:" và không in thêm gì nữa.


Điều này có thể được đơn giản hóa hơn nữa. Không cần "in" $ 1 \ n "". Bạn chỉ có thể sử dụng "print" để thay thế.
elysium bị nuốt chửng vào

Không, nó không thể, print $1không giống với print( print $_).
gỉ

Nó có thể: echo abc | perl -nw -e "print if (1)"sẽ in abc. Không cần $1tham khảo.
elysium nuốt chửng

@devouredelysium: Có, nhưng không muốn in cả dòng mà chỉ in số được khớp bởi biểu thức chính quy.
Ingo Blechschmidt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.