我正在使用codeeval.com上的挑战练习Perl,但是遇到了一个意外的错误。目标是逐行迭代文件,在每一行中,字符串和字符用逗号分隔,并找到该字符在字符串中最右边的出现位置。我得到了错误的答案,所以我修改了代码,仅打印变量的值,但我得到了以下错误:
“当“strict refs”被使用时,无法将字符串 (“Hello world”) 用作数组引用位于char_pos.pl第20行, line 1。”
我的代码如下。您可以在标题中看到文件的示例。您还可以看到原始输出代码,它错误地只显示了每个字符串中最右侧的字符。
“当“strict refs”被使用时,无法将字符串 (“Hello world”) 用作数组引用位于char_pos.pl第20行, 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
。 - mpapecwhile (<>) { … }
代替显式打开文件等操作,这是更符合 Perl 的惯用法。在查看文档时(注意需要使用perldoc -f substr
来按名称查找函数substr
),请同时查看perldoc -f rindex
。您可能需要使用/, */
进行分割,以允许在尾随字母之前加上空格。 - Jonathan Lefflermy ($word, $letter) = split(/,/,$_);
。@args
是一个相当糟糕的名称。 - ikegamisplit
中使用$_
。split(/,/);
可以达到同样的效果。 - Sobrique