2013-06-02 50 views
3

假設我們有下面的代碼:限制數組的大小?

#!usr/bin/perl 

use strict ; 
use warnings ; 



sub print_ele_arr{ 

my @arr = <STDIN> ; 
#print the elements of the array here . 
#do something else .. 
    } 
print_ele_arr() ; 

,但我想從用戶的輸入僅有3元素存儲到我的@arr陣列,該怎麼做,一般如何限制一個給定的數組的大小?

回答

6

只存儲3條線路,則可以使用

my $i = 1; 
while (defined(my $line = <STDIN>) and $i++ <=3) { 
    push @arr, $line; 
} 

至於第二個問題,你有什麼限制數組的大小呢?您可以使用數組切片得到的只是一個數組的前三個元素:

my @first_three = @arr[0 .. 2]; 
+0

我的意思是這樣防止用戶輸入3組以上的元素? – Jacoberl

+1

如果用戶在單行上輸入元素,那麼一般情況下,您無法控制自己鍵入的內容,因爲在輸入密鑰被擊中之前軟件看不到輸入。如果你想告訴然後關閉一個無效的條目然後只計算它們鍵入的字段數。 – Borodin

+0

在從終端接收到EOF後,從終端讀取(STDIN通常是)是錯誤的。 – ikegami

1
#!usr/bin/perl 

use strict ; 
use warnings ; 

sub print_ele_arr { 

    my @arr; 
    while (@arr < 3) { 
    push @arr, scalar <STDIN>; 
    } 

    # chomp(@arr); # remove newlines from @arr elements? 
    print "@arr\n"; 
} 

print_ele_arr() ; 

STDIN或任何其他輸入文件句柄讀取數據時有兩種方法給它,在標量或列表做上下文。

列表上下文強制一次讀取所有行,標量讀取一行。由於STDIN沒有固定大小,因此使用scalar函數強制執行標量上下文更好。

這在填充數組時是必要的,在填充純標量時是多餘的,例如。

my $single_line = <STDIN>;

是同樣的事情,寫作

my $single_line = scalar <STDIN>;

+0

從終端接收到EOF後從終端讀取(STDIN通常是)是錯誤的。 – ikegami

+0

應該應用'eof()'檢查嗎? –

+0

不需要,只需在''返回undef時停止。 (查看我的回答) – ikegami

1

我的意思是這樣防止用戶輸入3組以上的元素?

不。計算機無法控制人或物理鎖定鍵盤。他們可以打印所有他們想要的。甚至在你讀完第一行之前,他們甚至可以輸入三行以上的內容。

你有兩個選擇:

  1. 只讀的前三行。

    my @lines; 
    while (<>) { 
        push @lines, $_; 
        last if @lines == 3; 
    } 
    
    die "Bad input" if @lines < 3; 
    
  2. 如果在發送EOF之前輸入了三行以上的內容,則會發生錯誤。

    my @lines; 
    while (<>) { 
        die "Bad input" if @lines > 3; 
        push @lines, $_; 
    } 
    
    die "Bad input" if @lines < 3;