2013-07-09 2 views
0

을 분할 내가 배열을하고있어 그 내용 구절의 각 단어를. 분할하여 길이를 인쇄하려고하면 콘솔에서 111039391231319239188238139123919232913123... (더 많은 행)과 같은 엄청난 숫자를 보냅니다. 왜?펄 - 문자열

$mynames = $texto3; 
print $mynames. "\n"; 
@nameList = split(' ', $texto3); 
#print @nameList.length(); 
for ($to = 0; $to<@nameList.length; $to++){ 
     if($to<@nameList.length) { 
       @nameList[$to] = @nameList[$to] . "_" . @nameList[$to++]; 
     } 
     print $to; 
     #print @nameList[$to] . "\n"; 
} 
$string_level2 = join(' ', @nameList); 
#print $string_level2; 
+1

당신의'for' 루프는 거기에 버그가있는 것 같습니다. 나는 당신이'>'보다는'<'를 사용하려고했던 것이라고 믿는다. – levengli

+1

어떤 언어인가? Perl과 많이 달라 보이지 않습니다. 왜'split (''... ')이 작동하기를 기대합니까? 그리고'@ nameList.length'는 유효한 구문입니까? 예, Perl은 유연하지만 마음을 읽을 수는 없으며 . 당신이 가서이 일을 예상대로 구문까지 – innaM

+0

그것은 :-) ... –

답변

3

배열의 길이가 scalar @nameList 대신 @nameList.length 사용 얻으려면 :

여기 내 코드입니다.

에 대한 루프 전형적인는 덜보다 사용하는 운영자는 부작용을 이해하지 않는 한 당신은 후행 증가를 사용해서는 안 :,

for ($to = 0; $to < scalar(@nameList); $to++) ... 

을 예컨대을 계산합니다. 나는 다음 줄 믿습니다

@nameList[$to] = @nameList[$to] . "_" . @nameList[$to++]; 
가 ...로 작성되어야한다 ...

    $nameList[$to] = $nameList[$to] . "_" . $nameList[$to + 1]; 

마지막으로 당신은 루프 내에서 $to + 1를 참조 때문에 (경계 조건을 고려한다 사용하는 비교) :

if($to < (scalar(@nameList) - 1)) { 
    $nameList[ $to ] = $nameList[ $to ] . "_" . $nameList[ $to + 1 ]; 
} 
+1

또한, 수치 비교에서 스칼라로의 변환은 암시 적이므로 '$ to <@ nameList'만 사용하면됩니다. – choroba

+2

@choroba 동의합니다. 그러나이 경우 사용자는 초보자이므로 자신이 무엇을하고 있는지 이해하고 있음을 증명하기 위해 명시 적으로 코드를 작성하는 것이 안전합니다. 단축키는 나중에 올 수 있습니다. –

+2

3 개의 인수'for'를 사용하지 마십시오. 'foreach'를 대신 사용하십시오 :'for my $ to ($ .. $ # nameList) {' – shawnhcorey