我对编码很新,我需要一个失败的声明来打印出来,好像它是一个或死的。
我的部分代码示例:
print "Please enter the name of the file to search:";
chomp (my $filename=<STDIN>) or die "No such file exists. Exiting program. Please try again."\n;
print "Enter a word to search for:";
chomp (my $word=<STDIN>);
我需要它来为这两个print / chomp语句执行此操作。无论如何只是添加到这个?
整个计划:
#!/usr/bin/perl -w
use strict;
print "Welcome to the word frequency calculator.\n";
print "This program prompts the user for a file to open, \n";
print "then it prompts for a word to search for in that file,\n";
print "finally the frequency of the word is displayed.\n";
print " \n";
print "Please enter the name of the file to search:";
while (<>){
print;
}
print "Enter a word to search for:";
chomp( my $input = <STDIN> );
my $filename = <STDIN>;
my$ctr=0;
foreach( $filename ) {
if ( /\b$input\b/ ) {
$ctr++;
}
}
print "Freq: $ctr\n";
exit;
答案 0 :(得分:2)
您不需要测试文件句柄读取<>
是否成功。见I/O Operators in perlop。如果没有任何内容可读,则返回undef
,这正是您想要的,因此您的代码知道何时停止阅读。
至于删除换行符,无论如何都要单独chomp。否则,一旦读取确实在未定义的变量上返回undef
你chomp
,就会触发警告。
通常情况下,在某些资源上打开文件句柄$fh
,您就
while (my $line = <$fh>) {
chomp $line;
# process/store input as it comes ...
}
这也可以是STDIN
。如果它肯定只是一行
my $filename = <STDIN>;
chomp $filename;
您也不需要针对失败测试chomp
。请注意,它会返回已删除的字符数,因此如果没有$/
(通常是换行符),则会合法地返回0
。
要添加,总是测试是一个非常好的做法!作为该思维模式的一部分,请务必始终use warnings;
,我也强烈建议您使用use strict;
进行编码。
更新为重要问题编辑
在第一个while
循环中,您不会将文件名存储在任何位置。给定打印的问候语,而不是那个循环,你应该只读取文件名。然后你读了要搜索的单词。
# print greeting
my $filename = <STDIN>;
chomp $filename;
my $input = <STDIN>;
chomp $input;
然而,我们遇到了更大的问题:你需要open该文件,然后才能逐行浏览并搜索该单词。这是您需要测试的地方。请参阅链接的文档页面和教程perlopentut。首先检查具有该名称的文件是否存在。
if (not -e $filename) {
print "No file $filename. Please try again.\n";
exit;
}
open my $fh, '<', $filename or die "Can't open $filename: $!";
my $word_count = 0;
while (my $line = <$fh>)
{
# Now search for the word on a line
while ($line =~ /\b$input\b/g) {
$word_count++;
}
}
close $fh or die "Can't close filehandle: $!";
上面的-e
是其中一个文件测试,它检查给定文件是否存在。请参阅file-tests (-X)的文档页面。在上面的代码中,我们只是退出一条消息,但您可能希望打印消息,提示用户在循环中输入另一个名称。
我们在正则表达式中使用while
和/g
修饰符来查找一行中单词的所有出现。
我还强烈建议您始终使用
启动您的程序use warnings 'all';
use strict;