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 によってコマンド ラインで展開されます) でコマンドを実行し、文字列に出力をキャプチャします。これは、Perl コードの 1 行でファイルの内容を変数に丸呑みする 1 つの方法 (特に効率的な方法ではありません) です。

これを処理する別の方法は、CPAN 上のモジュールFile::Slurpまたはその関連モジュールの 1 つを使用することですが、単純な 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 の変数に入れる完全に受け入れられる方法があります。この方法は、すべてのプラットフォーム ( openwhile <BLAH>、文字列の追加、およびclose) で機能します。たとえばxyzzy.pl、2 つの異なる方法 (最初はポータブル、もう 1 つはそうでない):

$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

qxin perldoc perlopを参照してください。バッククォートはcatコマンドを実行し、ファイルの内容を$textスカラー変数、改行などに格納します。

于 2012-10-07T02:05:05.510 に答える