#tf.pl
#!/usr/local/bin/perl
use Util;
$file = shift;
$text = `cat $file`;
my @words = split_words ($text);
my @words = lc_words (@words);
my %count = count_hash(@words);
while (my ($w, $c) = each %count) {
print "$w\t$c\n";
$df{$w} = 1;
}
我在网站上看到了这段代码。在第3行$ file中给出了命令行参数提供的文件的名称(如果我错了,请纠正我,我是Perl新手)
在第4行,您会看到:
$text = `cat $file`;
我想知道这条线到底是做什么的?我知道cat filename
会显示终端中文件的内容(如果错误,请再次纠正我.Linux菜鸟也是如此)
我在IRC上问了这个问题,有人说这是做某事的坏方法,但我真的想知道这比做什么更好,而不是知道更好的替代方案
答案 0 :(得分:6)
它在命名文件上运行cat
命令($file
在命令行中由Perl而不是shell扩展,并捕获字符串中的输出。这是在单行Perl代码中将文件内容篡改为变量的一种方式(不是一种特别有效的方式)。
处理此问题的另一种方法是在CPAN上使用模块File::Slurp
或其中一个亲戚,但也可以在简单的Perl函数中使用更多行代码来完成。理想情况下,您只需编写一次该函数并重复使用它(有人已经使用File :: Slurp为您执行了此操作)。
如果脚本文件名为'xx.pl'(或者文件'xx.pl'被踢了),则此代码有效。
#!/usr/bin/env perl
use strict;
use warnings;
sub slurp
{
my($file) = @_;
open my $handle, '<', $file or return undef;
local $/ = undef;
my $content = <$handle>;
close $handle;
return $content;
}
my $content = slurp("xx.pl");
print $content;
答案 1 :(得分:4)
反引号(以便将它们与引号'
或"
区分开来)运行它们包含的任何外部应用程序,然后赋值将输出捕获到变量$text
。内容(反引号内)可以是任何可运行的进程:
$fileList = `ls`
$userList = `who`
等等。
这通常不是一个好主意,因为它将程序绑定到特定的操作系统(在这种情况下具有cat
命令的操作系统)。
可能不是问题,但您应该知道它会降低可移植性。
有一些完全可以接受的方法可以将文件的内容放入Perl中的变量中,该变量可以在所有平台上运行(open
,while <BLAH>
,附加字符串和{{1} }),例如这个示例程序close
,它以两种不同的方式读取自己(第一个是便携式,另一个不是):
xyzzy.pl
输出:
$sample1 = "";
open (INFILE, "xyzzy.pl") || die "Urk!";
while (<INFILE>) {
$sample1 .= $_;
}
close (INFILE);
$sample2 = `cat xyzzy.pl`;
if ($sample1 ne $sample2) {
print "Different\n";
print "[$sample1]\n";
print "[$sample2]\n";
} else {
print "Same\n";
}
答案 2 :(得分:1)
请参阅perldoc perlop中的qx
。反引号运行cat
命令并将文件内容存储到$text
标量变量,换行符和所有内容中。