我試圖在所有大寫字母中打印至少5個字符長的任何單詞。我的代碼是:如何確定數組中的變量的長度Perl
if (substr(@vdata, length(@vdata)-5, 5)) {
print "@vdata";
}
它似乎沒有工作。我究竟做錯了什麼?
我試圖在所有大寫字母中打印至少5個字符長的任何單詞。我的代碼是:如何確定數組中的變量的長度Perl
if (substr(@vdata, length(@vdata)-5, 5)) {
print "@vdata";
}
它似乎沒有工作。我究竟做錯了什麼?
您正在簡單的事情複雜化,你可以試試:
print uc $_ if length $_ > 5
如果這不是你所要完成你可能要編輯您的問題,包括一些樣本輸入和期望的輸出是什麼。
假設@vdata
包含您的單詞列表:
my @upper = map {length $_ > 5 ? uc $_ :()} @vdata;
print "@upper";
讓我們先來讓你片斷成一個完整的,可運行的程序啓動。
#!/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
而且(可能更重要的是)我打開strict
和warnings
。你應該養成爲你所有代碼做這件事的習慣。
那麼,如果我們試圖運行這個程序會發生什麼呢?
$ ./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;
}
(事實上,我們已經使用say
不print
得到一個自動換行符)。
運行,打印:
arrays
strings
different
lengths
因此,我們在正確的線路。
現在你想打印這些文字的大寫。這很簡單,我們只需使用uc
函數。
foreach my $word (@vdata) {
say uc $word if length($word) >= 5;
}
現在程序向我們大喊。
ARRAYS
STRINGS
DIFFERENT
LENGTHS
我想也許你一直在努力做太多。如果將問題分解爲更小的塊並且一次解決一個較小的問題,編程就會更容易。
您正在標量上下文中使用數組。您不能在數組上使用子字符串或字符串長度,只能在各個數組元素上使用。 – TLP