2012-03-18 39 views
5

Tôi muốn sử dụng một số dòng perl, như thế này:

perl -pe "$_=~s///e" 

Vấn đề là, bash tiếp tục mở rộng "$ _" biến. Tôi có thể đặt biểu thức perl thành các dấu nháy đơn, nhưng điều đó sẽ ngăn cản tôi thêm một số biến vào một tập lệnh.

Có cách nào ngăn chặn bash từ biến "$ _" mở rộng không?

+2

Chú ý gần hơn: đừng lố bịch. Các câu hỏi lập trình Shell hoàn toàn thuộc về stackoverflow. – tchrist

+1

Bạn không * cần * để sử dụng biến '$ _' ở đó. – TLP

+0

@TLP - đó chỉ là một ví dụ. Trong kịch bản thực sự, tôi thực sự * cần * nó. :) – Rogach

Trả lời

11
perl -pe '$_=~s///e' 

hoặc

perl -pe "\$_=~s///e" 
1

Mix-and-match.

perl -pe '$_=~s///e; echo "'"$idontknowperl"'"' 

Miễn là các phần được trích dẫn với nhau sẽ được coi là một đối số duy nhất.

+3

Vâng, nhưng trình biên dịch Perl sẽ không hài lòng khi bạn gọi phương thức/hàm 'echo'. :) – tchrist

5

Trước tiên: Bạn biết rằng bạn có thể sử dụng $ENV{myvariable} để truy cập vào biến môi trường, phải không? Và bạn không cần phải chỉ định $_ khi sử dụng m//, s///tr///?

Hơn nữa, nếu bạn muốn chuyển các biến cho perl, có nhiều cách khác để thực hiện điều đó ngoài việc cố gắng nội suy các biến shell vào mã perl của bạn.

perl -we 'my ($var1, $var2, $var3) = @ARGV;' "$MYFOO" "$BAR" "$baz" 

Nếu biến hệ vỏ của bạn không chứa khoảng trắng, bạn có thể phân phối bằng trích dẫn.

Bây giờ, nếu bạn muốn sử dụng các công tắc -p hoặc -n, cũng có nhiều cách khác.

perl -pwe 'BEGIN { my $var1 = shift; my $var2 = shift } #code goes here' 
    "$MYFOO" "$BAR" file1 file2 

Sử dụng shift trong một tuyên bố BEGIN sẽ loại bỏ các biến từ @ARGV để họ không được sử dụng bởi các while loop ngầm của -p-n chuyển mạch.

+1

'ENV' trong perl là đặc biệt cho các biến môi trường, chứ không phải các biến shell. –

Các vấn đề liên quan