perl中的字符串中引号中的cat命令有什么作用?

时间:2012-10-07 01:59:59

标签: perl

#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上问了这个问题,有人说这是做某事的坏方法,但我真的想知道这比做什么更好,而不是知道更好的替代方案

3 个答案:

答案 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中的变量中,该变量可以在所有平台上运行(openwhile <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标量变量,换行符和所有内容中。