Perl - 命令行输入和STDIN

Fic*_*ter 3 perl command-line stdin

所以我在下面为我的作业创建了这个脚本,它要求一个文本文件并检查单词的频率并列出出现次数最多的10个单词.一切正常,但我需要这个脚本能够通过命令行以及标准输入启动.

所以我需要能够编写'perl wfreq.pl example.txt',这应该启动脚本而不是问一个文本文件的问题.我不确定如何实现这一点,我想如果你在终端命令行中给它文本文件,我可能需要一个跳过STDIN的开始某处的while循环.

有人可以帮忙吗?

#! /usr/bin/perl

use utf8;
use warnings;

print "Please enter the name of the file: \n" ;
$file = <STDIN>;
chop $file;


open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";

while(<$DATA>) {                          
    tr/A-Za-z//cs;
    s/[;:()".,!?]/ /gio;                   
    foreach $word (split(' ', lc $_)) {  
    $freq{$word}++;                  
    }
}
foreach $word (sort { $freq{$b} <=> $freq{$a} } keys %freq) {           
   @fr = (@fr, $freq{$word});
   @ord = (@ord, $word);        
}
for ($v =0; $v < 10; $v++){
print " $fr[$v] | $ord[$v]\n";
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*man 8

<STDIN>您可以通过读取<>来从命令行提供的文件或stdin(如果没有文件)获取数据,而不是读取.

例如,与程序:

#!/usr/bin/env perl

while (<>) {
  print $_;
}
Run Code Online (Sandbox Code Playgroud)

该命令./script foo.txt将从中读取并打印行foo.txt,而./script本身将从stdin读取和打印行.


小智 6

只有在未提供文件名时才能读取STDIN:

my $DATA;
my $filename = $ARGV[0];
if ($filename) {
    open($DATA, $filename) or die $!;
} else {
    $DATA = STDIN;
}
Run Code Online (Sandbox Code Playgroud)

好的,我误解了这个问题,根据您的评论,您需要执行以下操作:

my $DATA;
my $filename = $ARGV[0];
unless ($filename) {
    print "Enter filename:\n";
    $filename = <STDIN>;
    chomp $filename;
}
open($DATA, $filename) or die $!;
Run Code Online (Sandbox Code Playgroud)

虽然我不得不说,用户提示非常类似unix.