2015-09-19 77 views
0

我試圖在所有大寫字母中打印至少5個字符長的任何單詞。我的代碼是:如何確定數組中的變量的長度Perl

if (substr(@vdata, length(@vdata)-5, 5)) { 
    print "@vdata"; 
} 

它似乎沒有工作。我究竟做錯了什麼?

+0

您正在標量上下文中使用數組。您不能在數組上使用子字符串或字符串長度,只能在各個數組元素上使用。 – TLP

回答

1

您正在簡單的事情複雜化,你可以試試:

print uc $_ if length $_ > 5 

如果這不是你所要完成你可能要編輯您的問題,包括一些樣本輸入和期望的輸出是什麼。

1

假設@vdata包含您的單詞列表:

my @upper = map {length $_ > 5 ? uc $_ :()} @vdata; 
print "@upper"; 
0

讓我們先來讓你片斷成一個完整的,可運行的程序啓動。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my @vdata = qw[this arrays has strings of different lengths]; 

if (substr(@vdata, length(@vdata)-5, 5)) { 
    print "@vdata"; 
} 

我已經把一些數據@vdata而且(可能更重要的是)我打開strictwarnings。你應該養成爲你所有代碼做這件事的習慣。

那麼,如果我們試圖運行這個程序會發生什麼呢?

$ ./vdata 
length() used on @vdata (did you mean "scalar(@vdata)"?) at ./vdata line 8. 

所以這是你的第一個問題。您正在使用陣列上的length函數。我認爲你並沒有特別清楚自己在想什麼。你對這個問題的描述似乎相當模糊。

我試圖打印到終端的所有大寫字母,至少有五個字符長。

我假設你正在存儲數組中的字@vdata。因此,不是獲取數組的長度,而是想要獲取數組中每個單獨元素的長度。我們首先設置一個循環來查看數組中的每個元素。

foreach my $word (@vdata) { 
    # do something with $word 
} 

塊內的代碼對@vdata中的每個元素運行一次。每次執行時,該元素都在$word中。所以讓我們打印$word如果它是五個字符或更多。

foreach my $word (@vdata) { 
    say $word if length($word) >= 5; 
} 

(事實上,我們已經使用sayprint得到一個自動換行符)。

運行,打印:

arrays 
strings 
different 
lengths 

因此,我們在正確的線路。

現在你想打印這些文字的大寫。這很簡單,我們只需使用uc函數。

foreach my $word (@vdata) { 
    say uc $word if length($word) >= 5; 
} 

現在程序向我們大喊。

ARRAYS 
STRINGS 
DIFFERENT 
LENGTHS 

我想也許你一直在努力做太多。如果將問題分解爲更小的塊並且一次解決一個較小的問題,編程就會更容易。