我在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;
答案 0 :(得分:3)
perl中的字符串是基本类型,而不是可下载数组。您可以使用substr
函数来获取单个字符(也只是字符串)或来自它们的子字符串。
另请注意,字符串比较是使用eq
完成的; ==
是数字比较。
答案 1 :(得分:3)
看起来您需要了解Perl函数。 Perl有很多字符串和标量的功能,并不总是可以直接了解它们。
然而,Perl有一个很棒的函数叫rindex,可以完全按照你的意愿行事。你给它一个字符串,一个子串(在这种情况下,是一个单个字符),它从 右边 中查找该子字符串的第一个位置strong>字符串的一侧(index从左侧做同样的事情。)
由于您正在学习Perl,因此获得一些关于 Modern Perl和标准编码实践的书籍可能是个好主意。这样,您就会了解更新的编码技术和标准编码实践。
这是一个示例程序:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use feature qw(say);
open my $fh, "<", shift;
while ( my $line = <$fh> ) {
chomp $line;
my ($string, $char) = split /,/, $line, 2;
if ( length $char != 1 or not defined $string ) {
say qq(Invalid line "$line".);
next;
}
my $location = rindex $string, $char;
if ( $location != -1 ) {
say qq(The right most "$char" is at position $location in "$string".);
}
else {
say qq(The character "$char" wasn't found in line "$line".)";
}
close $fh;
一些建议:
use autodie
允许您的程序在错误的open
上自动死亡。无需检查。open
声明是必须的。$_
。 chomp
。最重要的是, 错误检查 !我检查一行的格式,以确保只有一个逗号,并且我搜索的字符是一个字符。我还检查rindex
的退出值,以确保它找到了该字符。如果rindex
找不到该字符,则会返回-1
。
还要知道一行中的第一个字符是0
而不是1
。根据您的预期输出,您可能需要调整。
答案 2 :(得分:0)
while($i=<DATA>){
($string,$char)=split(",",$i);
push(@str,$string);}
@join=split("",$_), print "$join[-1]\n",foreach(@str);
__DATA__
Hello world, d
Hola mundo, H
Keyboard, b
Connecticut, n