急!新手学习中遇到的问题,望指点

急!新手学习中遇到的问题,望指点

本人刚接perl,遇到一些问题急需解决,望各位高手指点!!


原题:

Write a script that will open and read a file that is supplied as a command line
argument. Test it with this file:
/home/students/copy/405707/labs/lab4/lab4.2.txt
Make the script:
i. Output the words in reverse order.
ii. Replace all instances of "his" with "her".
It should output a single piece of text which has the words reversed and the
replacements done.

lab4.2.txt 里有若干句话,要将这些话倒置并且进行相应的替换。"his" -> "her"

自己写的script: lab4B2.pl

#!/usr/bin/perl
use warnings;
use strict;
open my $file, '<', 'lab4.2.txt' or die "cannot open the file: $!";
my $i;
my $str = "his";
my @all = <$file>;
foreach my $sentence (@all)
{   my @words = split (' ', $sentence);
       for ($i = 0; $i<30; $i++)
    {   if ($words[$i] eq $str)
        {
         splice (@words,$i,1,"her");
         }
}
     my @text = reverse @words;
#$, = ' ';
#print @text, "\n";
       foreach my $text1 (@text)
    {
        print "$text1 ";
     }
        print "\n";
}
exit;

运行后有如下错误,不过仍可以得出结果,不知道问题出在哪。
Use of uninitialized value in string eq at lab4B2.pl line 19, <$file> line 4.



欢迎有对本题更好的解答!!
代码里的所有$file用FILE代替
_____________________________________

误导了 抱歉 这么写没问题 自己句柄没用变量来表示过 想当然了 答案看楼下吧



[Copy to clipboard] [ - ]
CODE:
$words[$i] eq $str

你默认每一行有30个单词,但实际是这样一个情况吗?
有的行不足30个单词,所以$words[$i]就会有uninitialized的情况


[Copy to clipboard] [ - ]
CODE:
for ($i = 0; $i<30; $i++)

改成

[Copy to clipboard] [ - ]
CODE:
foreach  $i ( @words )

即可
ps:
代码可以用perl tidy格式化一下
可以考虑用正则表达式将his替换为her=》$line =~ s/\bhis\b/her/g

谢谢大家的帮助,程序经修改后可以运行了