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)
<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.