Làm thế nào để có được độc tố của Perl danh sách

Nhiệm vụ. Trong chương trình trong ngôn ngữ Perl có một danh sách. Danh sách này là dây và con số. Bạn cần để có được giá trị duy nhất từ danh sách này.

Giải pháp sử dụng các chức năng uniq từ thư viện List::Util

Cách dễ nhất và cách thuận tiện nhất để giải quyết vấn đề này là để sử dụng chức năng uniq từ thư viện List::Util. Đây là một ví dụ mã:

▶ Run
#!/usr/bin/perl

use List::Util qw(uniq);
use Data::Dumper;

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

Nếu bạn cứu văn bản này như một tập tin script.pl, và sau đó thực hiện những điều khiển perl script.pl, nó sẽ xuất hiện trên màn hình:

$VAR1 = [
          'one',
          'b',
          4
        ];

Chức năng uniq giữ gìn trật tự của các yếu tố, và nó hoạt động chính xác nếu danh sách này là undef.

Mã này sẽ làm việc từ Perl 5.26. Trước đó một phiên bản của Perl chứa phiên bản của sự thư viện List::Util trong đó không có chức năng uniq. Vì vậy, để để sử dụng giải pháp này, bạn cần phải hoặc là bản cập nhật Perl hoặc đặt một phiên bản mới hơn thư viện List::Util.

Tài liệu chính thức

Đây là một đoạn trong đầu ra perldoc List::Util về chức năng uniq:

  uniq
        my @subset = uniq @values

    *Since version 1.45.*

    Filters a list of values to remove subsequent duplicates, as judged by a
    DWIM-ish string equality or "undef" test. Preserves the order of unique
    elements, and retains the first value of any duplicate set.

        my $count = uniq @values

    In scalar context, returns the number of elements that would have been
    returned as a list.

    The "undef" value is treated by this function as distinct from the empty
    string, and no warning will be produced. It is left as-is in the
    returned list. Subsequent "undef" values are still considered identical
    to the first, and will be removed.

Mình quyết định

Chỉ đủ để viết một phiên bản của các chức năng uniq từ thư viện List::Util:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

sub uniq {
     my (@values) = @_;

     my %h = map {$_ => 1} @values;

     return keys %h;
}

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

Mã này hoạt động ngay lập tức trên bất kỳ phiên bản của Perl. Ở đây có ba đường từ tàu ngầm uniq:

  • my (@values) = @_; — đưa lập luận được truyền cho các trầm xuống một biến @values
  • my %h = map {$_ => 1} @values; — cho mỗi phần tử của @values đã tạo ra một danh sách của hai yếu tố, các nguyên tố và đơn vị, và tất cả các kết quả là danh sách cùng nhau vào một danh sách và gán danh sách đó để một băm. Một băm là một cách có thứ tự của các giá trị. Một chìa khóa có thể chỉ có một giá trị. Do khách sạn này của băm xóa tất cả các bản sao.
  • return keys %h; — trở lại danh sách này bao gồm chỉ có chìa khóa

Nhưng so với những chức năng uniq từ thư viện List::Util mã này có thiếu sót:

  • chức năng của chúng tôi uniq trở về các yếu tố trong trật tự tùy ý. Chạy khác nhau của cùng một mã dẫn đến kết quả khác nhau (giá trị trả lại bởi một chức năng uniq sẽ là tương tự, nhưng các thứ mà họ đang nằm sẽ khác nhau)
  • chức năng của chúng tôi không làm việc một cách chính xác nếu danh sách này là undef. Chúng tôi sử dụng tất cả các giá trị từ danh sách như băm tên. Và undef , có thể không là một quan trọng trong băm. Khi bạn cố gắng sử dụng undef như một chìa khóa và sẽ được sử dụng một chuỗi rỗng thay vì undef.

Các bài viết khác