2010-07-14 75 views
19

Làm cách nào để khởi tạo mảng thành 0?Khởi tạo mảng trong Perl

Tôi đã thử cách này.

my @arr =(); 

Nhưng nó luôn luôn ném cho tôi một lời cảnh báo, "Sử dụng giá trị chưa được khởi tạo". Tôi không biết kích thước của mảng trước đó. Tôi tự động điền vào nó. Tôi nghĩ đoạn mã trên được cho là sẽ khởi tạo nó thành 0.

Làm cách nào để làm điều này?

+5

Hiển thị cho chúng tôi mã bạn đang gặp sự cố. * Tại sao * bạn cần nó đặt thành 0? [Vấn đề XY] (http://www.perlmonks.org/?node=XY%20problem) – Daenyth

+0

Nó là một cái gì đó tương tự như thế này. Tôi có một mảng khác với các số như [0,0,0,1,2,2,3,3,3,4] bây giờ tôi phải đếm số 0,1,2,3,4 vì vậy tôi sẽ sử dụng một mảng khác ... và lưu trữ số đếm trong chỉ mục đã cho. vì vậy tôi sẽ có arr [0] = 3 arr [1] = 1 arr [2] = 2 arr [3] = 3 arr [4] = 4 như vậy là và khi tôi gặp một yếu tố tôi làm ... arr [i] = arr [i] + 1; cho điều này tôi cần phải bắt đầu với các yếu tố được bắt đầu bằng 0. Mã trên hoạt động. Nhưng nó cũng ném một cảnh báo. – jerrygo

+1

Bạn có thể thực hiện $ arr [i] ++ thay vì $ arr [i] = $ arr [i] + 1; cũng nếu mảng của bạn trống, $ arr [i] ++ sẽ vẫn đặt $ arr [i] thành 1; – MkV

Trả lời

45

Nếu tôi hiểu bạn, có lẽ bạn không cần một mảng số 0; thay vào đó, bạn cần một mã số băm. Các phím băm sẽ được các giá trị trong mảng khác và các giá trị hash sẽ là số lần giá trị tồn tại trong mảng khác:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my %tallies; 
$tallies{$_} ++ for @other_array; 

print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;  

Output:

0 => 3 
1 => 1 
2 => 2 
3 => 3 
4 => 1 

Để trả lời câu hỏi cụ thể của bạn trực tiếp hơn, để tạo một mảng được điền bằng một loạt các số 0, bạn có thể sử dụng kỹ thuật trong hai ví dụ sau:

my @zeroes = (0) x 5;   # (0,0,0,0,0) 

my @zeroes = (0) x @other_array; # A zero for each item in @other_array. 
           # This works because in scalar context 
           # an array evaluates to its size. 
+0

Cảm ơn bạn. Thật ngạc nhiên. Nhưng vẫn tự hỏi, tại sao tôi không thể có các phần tử mảng được viết tắt là 0. mà không sử dụng hàm băm. Vấn đề là nó chỉ hoạt động, nhưng cho tôi một cảnh báo trước khi truy cập một giá trị chưa được khởi tạo. – jerrygo

+1

@ jerrygo: bạn có cơ hội sử dụng phiên bản cũ của perl không? Mã này ở trên không nên cung cấp cho bạn bất kỳ cảnh báo nào. – Ether

+0

Cảm ơn bạn rất nhiều..đã giải quyết được vấn đề. :) – jerrygo

15

Bạn có ý nghĩa gì khi "khởi tạo mảng thành 0"? Mảng không chứa "số không" - chúng có thể chứa "số nguyên tố", giống như "danh sách trống". Hoặc, bạn có thể có một mảng với một yếu tố, trong đó yếu tố đó là một số không: my @array = (0);

my @array =(); nên chỉ làm việc tốt - nó phân bổ một mảng mới gọi là @array, và sau đó gán cho nó danh sách rỗng, (). Lưu ý rằng điều này giống hệt với việc chỉ cần nói my @array;, vì giá trị ban đầu của một mảng mới là danh sách trống.

Bạn có chắc là mình đang gặp lỗi từ dòng này chứ không phải ở đâu đó trong mã của mình? Đảm bảo bạn có use strict; use warnings; trong mô-đun hoặc tập lệnh của mình và kiểm tra số dòng của lỗi mà bạn nhận được. (Đăng một số mã ngữ cảnh ở đây cũng có thể hữu ích.)

+0

Xin lỗi. Vâng. Tôi muốn khởi tạo các phần tử của mảng đến 0. Do đó tôi có thể sử dụng mảng như một số loại bộ đếm cho mỗi chỉ mục. Xin vui lòng tham khảo ở trên bình luận cho vấn đề chính xác. – jerrygo

+0

nếu bạn muốn khởi tạo một mảng để có cùng số phần tử với một mảng khác tất cả giá trị cụ thể; làm một cái gì đó như; my @ arr2 = (0) x @ arr1; – MkV

+0

@MkV: hoặc 'my @ arr2 = (0) x $ # arr1', phải không? – dawg

3

Để tạo đầu ra trong nhận xét của bạn cho bài đăng, điều này sẽ d o nó:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my @array; 
my %uniqs; 

$uniqs{$_}++ for @other_array; 

foreach (keys %uniqs) { $array[$_]=$uniqs{$_} } 

print "array[$_] = $array[$_]\n" for (0..$#array); 

Output:

array[0] = 3 
    array[1] = 1 
    array[2] = 2 
    array[3] = 3 
    array[4] = 1 

này khác với thuật toán đã nêu của bạn sản xuất một mảng song song với không giá trị, nhưng nó là một cách Perly hơn để làm việc đó ...

Nếu bạn phải có một mảng song song có cùng kích thước với mảng đầu tiên của bạn với các phần tử được khởi tạo là 0, câu lệnh này sẽ tự động thực hiện: @array=(0) x scalar(@other_array); nhưng thực sự, bạn không cần thực hiện điều đó.