0
#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 上问过这个问题,有人说这是一种糟糕的做事方式,但我真的很想知道这比知道它的更好选择更重要的是什么

4

3 回答 3

6

cat在命名文件上运行命令($file在命令行中由 Perl 扩展,而不是 shell)并捕获字符串中的输出。这是在一行 Perl 代码中将文件内容放入变量中的一种方式(不是特别有效的方式)。

处理此问题的另一种方法是使用File::SlurpCPAN 上的模块或其亲属之一,但也可以在简单的 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;
于 2012-10-07T02:01:57.770 回答
4

反引号(以便将它们与引号或 区别开来)'"它们包含的任何内容作为外部应用程序运行,然后赋值将输出捕获到变量$text。内容(在反引号内)可以是任何可运行的进程:

$fileList = `ls`
$userList = `who`

等等。

这通常不是一个好主意,因为它将程序与特定的操作系统(cat在这种情况下带有命令的操作系统)联系在一起。

可能不是问题,但您应该知道它会降低可移植性。

有一些完全可以接受的方法可以将文件的内容放入 Perl 中的变量中,一种适用于所有平台(open、、while <BLAH>附加字符串和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";
}

输出:

Same
于 2012-10-07T02:02:29.723 回答
1

请参阅perldoc perlopqx。反引号运行命令并将文件的内容存储到标量变量、换行符和所有内容中。cat$text

于 2012-10-07T02:05:05.510 回答