2009-03-22 39 views

Trả lời

24

Theo mặc định , thay thế lấy một chuỗi như là một phần để thay thế. Để thực thi mã trong quá trình thay thế, bạn phải sử dụng cờ e.

$numOfChar = 10; 

s/^(.*)/' ' x $numOfChar . $1/e; 

Điều này sẽ thêm $numOfChar không gian vào đầu văn bản của bạn. Để làm điều đó cho tất cả các dòng trong văn bản hoặc sử dụng -p cờ (cho nhanh chóng, xử lý một dòng):

cat foo.txt | perl -p -e "$n = 10; s/^(.*)/' ' x $n . $1/e/" > bar.txt 

hoặc nếu đó là một phần của một kịch bản lớn hơn sử dụng -g-m cờ (-g cho toàn cầu , tức là lặp đi lặp lại thay và -m để làm ^ trận đấu vào lúc bắt đầu của mỗi dòng):

$n = 10; 
$text =~ s/^(.*)/' ' x $n . $1/mge; 
8

Bạn nói đúng. Toán tử x của Perl lặp lại một chuỗi một số lần.

print "test\n" x 10; # prints 10 lines of "test" 

CHỈNH SỬA: Để làm điều này trong một biểu thức chính quy, tốt nhất nên chỉ định giá trị cho biến khác.

my $spaces = " " x 10; 
s/^\s*(.*)/$spaces$1/; 

Có nhiều cách để làm điều đó mà không cần thêm biến, nhưng chỉ $ 0,02 là dễ bảo trì hơn nếu bạn làm theo cách này.

EDIT: Tôi đã sửa lại regex của mình. Xin lỗi tôi đã không đọc nó ngay lần đầu tiên.

+1

Điều đó không hiệu quả. Tôi nghĩ rằng nó chỉ hoạt động bên trong tuyên bố in – chappar

+0

Đối với tôi, nó hoạt động với perl 5.10.0 – tstenner

+0

Tôi đang thử một cái gì đó như thế này. s /^(.*)/ 'p' x $ numOfChar /; Tôi đã sửa đổi câu hỏi của mình – chappar

15

biểu hiện thường xuyên của bạn có thể được viết như sau:

$numOfChar = 10; 

s/^(.*)/(' ' x $numOfChar).$1/e; 

nhưng - bạn có thể làm điều đó với:

s/^/' ' x $numOfChar/e; 

Hoặc mà không sử dụng regexps tại tất cả:

$_ = (' ' x $numOfChar) . $_; 
+0

Lưu ý rằng câu trả lời này không còn áp dụng nữa, vì chappar đã thêm \ s * vào câu hỏi của mình sau khi câu trả lời này được đưa ra. – ysth

+1

Hiện tại không có câu trả lời nào thực sự áp dụng. Nhưng có thể dễ dàng sửa. Chỉ cần thay đổi: s/^/'' x $ numOfChar/e; thành: s/^ \ s */'' x $ numOfChar/e; –

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