2012-10-07 27 views
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号线$文件中给出,将已与命令行参数(纠正我,如果我错了,我是一个Perl的新秀)perl中的字符串中的cat命令在引号中做了什么?

第4行中看到你所提供的文件的名称:

$text = `cat $file`; 

我想知道这条线究竟做了什么?我知道cat filename在向您显示终端中的文件内容(再次,纠正我,如果错了,Linux新手也)

我问过这个关于IRC和有人说这是一个坏的方式做事,但我真的想要知道这是做什么比知道更好的替代它

+0

请注意,shebang行'#!/ usr/local/bin/perl'除非它是该文件的第一行,否则不行。 –

回答

4

反引号(以便从报价'"区分它们)运行任何他们含有作为一个外部应用程序,则分配捕获输出到可变$text。的内容(反引号内)可以是任何可运行的过程:

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

等。

它通常不是一个好主意,因为它将程序绑定到特定的操作系统(在这种情况下使用cat命令)。

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

有完全可以接受的方式,已经获取文件的内容到Perl中的变量,一个是将在所有平台上工作(openwhile <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 
+0

那么这里有什么特别的?引号或cat命令是否存在于字符串中? –

+0

@ProgrammingNoob,它是引号(我已经更新了答案,对此更明确)。 – paxdiablo

+1

你应该使用“open”和词法文件句柄的三参数版本。而较低的优先级'或'你甚至可以跳过大括号。 '打开我的$文件句柄,'<',“xyzzy.pl”或死“悲惨”;' – dgw

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; 
+0

是的,在某些shell语言中可以使用相同的构造。 –

+1

@HotLicks当然,这是Perl从中复制它的地方。 – Barmar

1

参见qxperldoc perlop。反引号运行cat命令并将文件的内容存储到$text标量变量,换行符和全部内容中。