除了chomp之外,需要像开放式或DIE这样的东西

时间:2016-11-16 22:58:50

标签: perl chomp

我对编码很新,我需要一个失败的声明来打印出来,好像它是一个或死的。

我的部分代码示例:

    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;

1 个答案:

答案 0 :(得分:2)

您不需要测试文件句柄读取<>是否成功。见I/O Operators in perlop。如果没有任何内容可读,则返回undef,这正是您想要的,因此您的代码知道何时停止阅读。

至于删除换行符,无论如何都要单独chomp。否则,一旦读取确实在未定义的变量上返回undefchomp,就会触发警告。

通常情况下,在某些资源上打开文件句柄$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;