【问题标题】:Perl - Splitting a stringPerl - 拆分字符串
【发布时间】:2013-07-07 01:30:15
【问题描述】:

我正在做一个包含短语的每个单词的数组。当我尝试拆分它并打印长度时,控制台会给我一个巨大的数字,例如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;

【问题讨论】:

  • 您的 for 循环似乎有错误。我相信您的意思是使用 &lt; 而不是 &gt;
  • 这是什么语言?对我来说看起来不太像 Perl。为什么你期望split( ' ' ... 工作?谁让你知道@nameList.length 是有效的语法?是的,Perl 很灵活,但它无法读懂你的想法,你也不能只是随手编造语法并期望它能够工作。
  • 可能是 Perl 6,有点... :-)
  • 尝试:print "$to "; 并使用空格字符而不是匹配进行拆分,执行 awk 拆分。见perldoc.perl.org/functions/split.html@nameList.length 有效;这意味着字符串将@nameList中的项目数连接到字符串$_的长度。
  • 没有人告诉过您将use strictuse warnings 添加到所有Perl 程序的顶部吗?

标签: arrays perl split variable-length-array


【解决方案1】:

要获取数组的长度,请使用scalar @nameList 而不是@nameList.length

典型的for循环在向上计数时使用小于运算符,例如:

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 ];
}

【讨论】:

  • 此外,在数值比较中,转换为标量是隐式的,因此您可以简单地使用$to &lt; @nameList
  • @choroba 我同意 - 但在这种情况下,用户是如此新手,以至于他们更安全地明确编码以向自己证明他们了解自己在做什么。快捷方式可以稍后出现。
  • 请不要使用三个参数for。改用foreachfor my $to ( 0 .. $#nameList ){
  • 请使用三个参数列表。这是 Perl。有很多方法可以做到这一点。记住这一点。对于数组,for 的列表版本通常更快,是的。但你不必总是这样做。 Golden Hammer 不是编程或生活中推荐的方法。
猜你喜欢
  • 2013-11-08
  • 2012-07-30
  • 2012-10-13
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2015-11-20
相关资源
最近更新 更多