2008-11-10 36 views
47

Trong Python, nếu tôi làm điều này:Làm thế nào tôi có thể lặp lại một chuỗi N lần trong Perl?

print "4" * 4 

tôi nhận được

> "4444" 

Trong Perl, tôi muốn có được

> 16 

Có một cách dễ dàng để làm những cựu trong Perl?

+0

Điều này cũng có thể xảy ra với các biến chuỗi (và các biểu thức chuỗi), xem [câu trả lời của tôi] (http://stackoverflow.com/a/30100928/2932052). – Wolf

Trả lời

86
$ perl -e 'print "4"x4; print "\n"' 
4444 

Toán tử x được ghi trong perloc perlop. Dưới đây nhị phân có nghĩa là một nhà điều hành lấy hai đối số, không bao gồm các bit, bằng cách này.

Nhị phân "x" là toán tử lặp lại. Trong ngữ cảnh vô hướng hoặc nếu toán hạng bên trái không được đặt trong dấu ngoặc đơn, nó trả về một chuỗi gồm toán hạng bên trái lặp lại số lần được chỉ định bởi toán hạng đúng. Trong ngữ cảnh danh sách, nếu toán hạng bên trái được đặt trong dấu ngoặc đơn hoặc là một danh sách được tạo bởi "qw/STRING/", nó lặp lại danh sách. Nếu toán hạng đúng là số không hoặc âm, toán tử trả về một chuỗi trống hoặc danh sách trống , tùy thuộc vào ngữ cảnh.

 print ’-’ x 80;    # print row of dashes 

     print "\t" x ($tab/8), ’ ’ x ($tab%8);  # tab over 

     @ones = (1) x 80;   # a list of 80 1’s 
     @ones = (5) x @ones;  # set all elements to 5 

perl -e có nghĩa là để thực thi mã perl từ dòng lệnh:

 
$ perl --help 
Usage: perl [switches] [--] [programfile] [arguments] 
    
    -e program  one line of program (several -e's allowed, omit programfile) 
+0

hoàn hảo, cảm ơn :) – izb

+1

Chỉ cần một nhận xét - nó có thể không rõ ràng cho tất cả người dùng perl (đặc biệt là những người mới) tùy chọn -e, vì vậy nó sẽ là tốt hơn để cung cấp ví dụ mã trực tiếp (như phản ứng của Paul không). –

+0

'perl -Esay + 4x4' Ở đây, '-E' cho phép 'sử dụng 5.010' (đặc biệt - tính năng 'nói'). 'say" $ var "' giống với 'print" $ var \ n "'. Trong bối cảnh vô hướng, toán tử 'x' luôn trả về một chuỗi, vì vậy không cần sử dụng dấu ngoặc kép ở đây. – jfs

16

Nó rất giống trong Perl

print "4" x 4; 
39

Trong Perl, bạn muốn sử dụng toán tử "x".

Lưu ý sự khác biệt giữa

"4" x 4 

("4") x 4 

Cựu tạo ra một chuỗi lặp đi lặp lại:

"4444" 

sau một danh sách lặp đi lặp lại:

("4", "4", "4", "4") 
+0

bạn tạo một điểm tốt ở đó –

+3

Trong Perl 6 toán tử 'x' luôn trả về chuỗi (toán hạng bên trái được đánh giá trong một ngữ cảnh chuỗi ví dụ, 4x4 ->" 4 "x4 ->" 4444 "),' xx' - lặp lại op cho các danh sách ví dụ: 4xx4 -> (4) xx4 -> (4,4,4,4). – jfs

8

FWIW, cũng là print 4 x 4 trong Perl.

Nói chung, trong Perl, các toán tử là đơn hình, tức là. bạn có các toán tử khác nhau cho ngữ nghĩa chuỗi, cho ngữ nghĩa số, cho ngữ nghĩa bitwise, v.v., ở đâu nó có ý nghĩa, và loại toán hạng phần lớn không quan trọng. Khi bạn áp dụng toán tử số cho một chuỗi, chuỗi được chuyển đổi thành số đầu tiên và bạn nhận được thao tác bạn yêu cầu (ví dụ: nhân) và khi bạn áp dụng toán tử chuỗi cho một số, chuỗi đó được chuyển thành chuỗi và bạn nhận được thao tác bạn yêu cầu (ví dụ: lặp lại). Perl chú ý đến nhà điều hành đầu tiên và các loại toán hạng chỉ đứng thứ hai - nếu thực sự nó trả tiền cho họ bất kỳ tâm trí nào cả.

Điều này ngược lại với Python và hầu hết các ngôn ngữ khác, nơi bạn sử dụng một nhóm toán tử và các loại toán hạng xác định ngữ nghĩa bạn thực sự sẽ nhận được - nghĩa là. các toán tử đa hình.

+1

Thực tế bạn không thể có nghĩa là bạn nên, nhất thiết phải. Tôi nghĩ rằng làm cho ý định rõ ràng làm cho mã dễ đọc hơn cho tất cả mọi người. Trích dẫn bỏ qua làm cho nó ít có thể đọc được cho đôi mắt của tôi. –

+1

a) Bạn có thấy gì trong câu trả lời của tôi về những gì bạn nên hoặc không nên làm không? (Điều này '4 x 4' là không thể hiển thị trong thực tế mã Perl anyway.) B) Nếu nó ít có thể đọc được cho bạn, bạn đang chú ý đến những điều sai trái (các hình thức của toán hạng, chứ không phải là nhà điều hành) . –

+2

a) Bạn có thấy bất cứ điều gì trong nhận xét của tôi về việc liệu bạn có nói điều gì nên hoặc không nên làm không? b) Khi bạn đối phó với nhiều ngôn ngữ trên cơ sở gần như hàng ngày, mỗi chút giúp. Sử dụng dấu ngoặc kép là hoàn toàn rõ ràng một (rõ ràng) bất kỳ ngôn ngữ, bỏ qua chúng có nghĩa là một bước tinh thần thêm để có. –

1

Tất cả các câu trả lời, cho đến nay, bỏ lỡ kể rằng các nhà điều hành x không chỉ làm việc trên xâu mà còn trên các biến chuỗi hoặc biểu thức xây dựng chuỗi:

$msg = "hello "; 
print $msg x 2; 
print ($msg x 2) x 2; 
1

Nếu bạn muốn in 10 nhân vật "A" s, bạn cũng có thể làm

perl -e 'print "A" x 10'; echo 

Ví dụ này với sản lượng

[email protected]:~$ perl -e 'print "A" x 10'; echo 
AAAAAAAAAA 
[email protected]:~$ 
Các vấn đề liên quan