Vì vậy, điều này đã làm cho tôi đi bonkers trong nửa giờ qua. Có cách nào cho tôi để lấy một mảng mảng đến cuối của một mảng vô danh? Tôi đã thử:
(split(' ',$test_line))[1..$#_]
và tôi đã cố gắng: (split(' ',$test_line))[1..-1]
nhưng aggravatingly, không ai trong số những người làm việc. Tôi thực sự không muốn có một biến tạm thời thêm vào instantiated mảng trung gian (mà tôi không cần). Và tôi thực sự không muốn sử dụng một lớp lót xấu xí và không thể đọc được (tìm thấy một vài trong số đó trực tuyến). Có thực sự không có cách nào thẳng về phía trước để làm điều này?Có cách nào để lấy một lát đến cuối một mảng ẩn danh trong Perl không?
Trả lời
Danh sách, đó là những gì bạn có trong ví dụ của bạn, không thể được cắt từ cuối. Điều này chủ yếu là vì danh sách không phải là cấu trúc dữ liệu thích hợp trong Perl, nhưng nhiều hơn một cấu trúc mà trình thông dịch sử dụng để di chuyển dữ liệu xung quanh. Vì vậy, khi biết rằng bạn chỉ có thể cắt một danh sách ngay từ đầu, các tùy chọn của bạn là đặt một biến mảng và sau đó cắt, thay đổi thuật toán của bạn để trả lại những gì bạn muốn hoặc như sau:
Nếu bạn đang gán giá trị cho một cái gì đó, bạn có thể sử dụng undef
trong mỗi khe bạn không muốn:
my (undef, @list) = split ' ' => $test_line;
Nếu bạn đăng một số mã khác, tôi có thể sửa đổi.
Hoặc, bạn có thể sử dụng một số công cụ từ lập trình hàm. Các cặp chức năng drop
và take
có thể hữu ích để thay đổi kích thước một danh sách mà không biến thêm:
sub take {
my $n = shift;
@_[0..$n-1]
}
sub drop {
my $n = shift;
@_[$n..$#_]
}
và sau đó dụ của bạn trở nên
drop 1, split ' ' => $test_line;
drop 1
cũng thường được gọi là tail
sub tail {drop 1, @_}
và tất nhiên, vì tất cả những điều này quá ngắn, nếu bạn muốn nội tuyến:
sub {shift; @_}->(split ' ' => ...)
Ý tưởng của tôi nằm dọc theo các dòng: % test_hash = (split ('', $ test_line)) [1 .. $ # _]; Trong trường hợp cụ thể đó, cách tiếp cận của bạn hoạt động tốt, nhưng tôi đã hy vọng một cái gì đó chung chung hơn một chút, để khi tôi không muốn 10 món hàng đầu tiên, tôi sẽ không bị mắc kẹt khi viết ra 10 lần ... – Eli
@Eli => thật đáng buồn đó không phải là một tính năng của danh sách lát trong perl5. Các giải pháp chung là một cái gì đó như 'drop' hoặc' take'. Tùy thuộc vào nội dung của bạn, bạn cũng có thể sử dụng grep để xóa các mục bạn không muốn. –
Câu trả lời hay. Có * là * các giải pháp một lớp, nhưng chúng thực sự không thuộc về mã sản xuất. – tchrist
Tôi không tin bạn có thể chỉ định một chỉ số cho các phần tử cuối cùng của một biểu thức danh sách tùy ý, nhưng làm thế nào về:
split(' ', (split ' ', $test_line, 2)[1])
Bằng cách này, không có mảng vô danh ở đây (hoặc trong câu hỏi ban đầu của bạn), chỉ danh sách.
Khi OP nói lát, tôi nghĩ splice
:
@allTheWordsExceptTheFirstTwo = splice @{[split' ', $test_line]}, 2;
@allExceptTheFirstAndLastTwo = splice @{[split' ', $test_line]}, 2, -2;
nếu bạn đang mở để tách hai lần:
my @g = (split ' ', $test_str)[1..split(' ', $test_str)];
hay đúng hơn (vì chia trả về số các trường được tìm thấy (nhiều hơn chỉ số của trường cuối cùng vì nó là 0-based):
my @g = (split ' ', $test_str)[1..split(' ', $test_str)-1];
thật không may là chúng ném một cảnh báo không được chấp nhận trong 'pragma' cảnh báo và ghi đè nội dung của @_ (trừ khi bạn đang sử dụng 5.12, sau đó bạn là tốt, nếu không đi với một biến tạm thời, nội tuyến tiểu hoặc một vòng lặp).
Bạn có thể sử dụng phạm vi tiêu cực trong subscript mảng để giải quyết một số bất kỳ của các yếu tố từ cuối cùng:
my $x = join ' ' => 'a' .. 'z';
my @x = (split ' ', $x)[-13 .. -1];
Tuy nhiên, điều này đòi hỏi bạn phải biết tổng số các yếu tố trong kết quả của split
để loại bỏ chỉ là yếu tố đầu tiên.
Nếu điều này xảy ra chỉ trong một nơi, sử dụng một khối do
nên làm việc:
my $x = join ' ', 'a' .. 'z';
my @x = do { my @y = (split ' ', $x); @y[1 .. $#y] };
Trong trường hợp của bạn, tôi sẽ yếu tố hiện toàn bộ hoạt động cho một chương trình con nếu nó là vụ phải được sử dụng thường xuyên, đi qua chuỗi hơn là kết quả của sự split
đến chương trình con (có thể được khái quát hóa hơn nữa bằng cách cho phép người sử dụng để vượt qua mô hình phân chia cũng như:
my $x = join ' ', 'a' .. 'g';
my @x = skip_first_n_from_split(3, $x);
print Dump \@x;
sub skip_first_n_from_split {
my ($n, $x) = @_;
my @y = split ' ', $x;
return @y[$n .. $#y];
}
có vui vẻ:
#!/usr/bin/perl
use strict; use warnings;
my $x = join ' ', 1 .. 8;
my @skippers = map make_skipper(' ', $_), 0 .. 7;
print "@$_\n" for map $_->($x), @skippers;
sub make_skipper {
my ($pattern, $n) = @_;
return sub {
my $string = shift;
my $i = 0;
return [ grep $i++ >= $n, split $pattern, $string ];
}
}
Output:
1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 3 4 5 6 7 8 4 5 6 7 8 5 6 7 8 6 7 8 7 8 8
này chỉ có answered 'gọn gàng' trên Perlmonks bởi BrowserUK, đây là những gì bạn muốn làm:
my @slice = sub{ @_[1..$#_] }->(split ' ', $test_line);
- 1. Làm cách nào để lấy tất cả các phần tử từ chỉ mục N đến cuối từ một mảng Perl ẩn danh?
- 2. Trong Perl, làm cách nào để tạo một băm có khóa đến từ một mảng nhất định?
- 3. Trong Scala, làm thế nào để có được một lát của một danh sách từ phần tử thứ n đến cuối danh sách mà không biết chiều dài?
- 4. mảng lát cắt từ N đến phần tử cuối
- 5. Lấy tham chiếu đến mục cuối cùng của một mảng
- 6. Có cách nào trong C++ để lấy một mảng phụ từ một mảng không?
- 7. Lấy chiều dài của một mảng trong một băm Perl
- 8. Perl Làm thế nào để lấy một mảng từ một mảng băm?
- 9. Perl: tham chiếu mảng so với mảng ẩn danh
- 10. Làm cách nào để tạo một mảng ẩn danh ([]) với 'các vùng trống'?
- 11. Làm cách nào để lấy phần tử cuối cùng của một mảng trong Ruby?
- 12. Trong Clojure, có thể định nghĩa một hàm ẩn danh trong một hàm ẩn danh không?
- 13. Làm thế nào để lát một mảng cấu trúc?
- 14. Lấy phần tử cuối cùng của một mảng trong CoffeeScript
- 15. Làm thế nào để lát một tuple trong scala
- 16. Có cách nào nhanh chóng để lấy hai ký tự cuối cùng trong một chuỗi không?
- 17. Tại sao tôi có thể cập nhật một lát danh sách chứ không phải một lát chuỗi trong python?
- 18. Làm thế nào để chạy một hàm ẩn danh trong Perl?
- 19. C# Mảng lát không có bản sao
- 20. Làm cách nào để lấy chỉ mục của một phần tử trong một mảng?
- 21. có thể tham chiếu đến mảng ẩn danh trong vòng lặp for không?
- 22. Có cách nào để chỉ định một loại số lượng ẩn danh trống không?
- 23. Làm thế nào để lát một deque?
- 24. gán hai biến một danh sách lát
- 25. Làm thế nào để cắt một danh sách từ một phần tử n đến cuối trong python?
- 26. lấy mục thứ hai đến mục cuối cùng của một mảng?
- 27. Cách tốt nhất để có được các phần tử N cuối cùng của một mảng Perl là gì?
- 28. Trong Perl, có cách nào để buộc một stash?
- 29. Nhận nghĩa của 2D lát một mảng 3D trong NumPy
- 30. Làm cách nào để chuyển một biến theo giá trị sang một hàm javascript ẩn danh?
tôi nghi ngờ câu trả lời tốt nhất sẽ là thêm biến tạm thời. Trên dòng đầu tiên của bạn, lý do '$ # _' không hoạt động là '@ _' không phải là danh sách từ biểu thức. – aschepler