【发布时间】:2014-10-30 12:03:17
【问题描述】:
我正在使用来自 codeeval.com 的挑战练习 Perl,但遇到了意外错误。目标是逐行遍历文件,其中每一行都有一个字符串和一个用逗号分隔的字符,并找到该字符在字符串中最右边的位置。我得到了错误的答案,所以当我收到以下错误时,我更改了代码以仅打印出变量值:
Can't use string ("Hello world") as an ARRAY ref while "strict refs" in use at char_pos.pl line 20, <FILE> line 1.
我的代码如下。您可以在标题中查看文件中的示例。您还可以看到原始输出代码,它错误地只显示每个字符串中最右边的字符。
#CodeEval challenge: https://www.codeeval.com/open_challenges/31/
#Call with $> char_pos.pl numbers
##Hello world, d
##Hola mundo, H
##Keyboard, b
##Connecticut, n
#!/usr/bin/perl
use strict;
use warnings;
my $path = $ARGV[0];
open FILE, $path or die $!;
my $len;
while(<FILE>)
{
my @args = split(/,/,$_);
$len = length($args[0]) - 1;
print "$len\n";
for(;$len >= 0; $len--)
{
last if $args[0][$len] == $args[1];
}
#if($len > -1)
#{
# print $len, "\n";
#}else
#{
# print "not found\n";
#}
}
编辑: 根据下面的答案,这是我开始工作的代码:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
open my $fh,"<",shift;
while(my $line = <$fh>)
{
chomp $line;
my @args = split(/,/,$line);
my $index = rindex($args[0],$args[1]);
print $index>-1 ? "$index\n" : "Not found\n";
}
close $fh;
【问题讨论】:
-
检查
perldoc substr而不是$args[0][$len],如果您要比较字符串,请使用eq。 -
并使用
while (<>) { … }而不是显式打开文件等;它是更惯用的 Perl。当您检查文档时(注意它需要是perldoc -f substr才能按名称查找函数substr),请查找perldoc -f rindex。您可能希望在/, */上进行拆分,以便在尾随字母之前留出空格。 -
提示:您可能更喜欢
my ($word, $letter) = split(/,/,$_);。@args是一个相当糟糕的名字。 -
我也倾向于避免在
split中使用$_。split ( /,/ );会做同样的事情。 -
@ikegami - 我喜欢这种拆分方法。将来我会牢记这一点。谢谢!
标签: arrays string perl file-io