3

<STDIN>特殊なファイル ハンドルから読み取り、これをサブルーチンに渡すPerl モジュールが必要です。私のコードを見れば、私の言っていることが理解できるでしょう。以前の様子は次のとおりです。

#!/usr/bin/perl
use strict; use warnings;

use lib '/usr/local/custom_pm'
package Read_FH

sub read_file {
my ($filein) = @_;
open FILEIN, $filein or die "could not open $filein for read\n";
# reads each line of the file text one by one
while(<FILEIN>){
# do something
}
close FILEIN;

現在、サブルーチンはファイル名 ( に格納されて$fileinいる) を引数として取り、ファイル ハンドルを使用してファイルを開き、ファイン ハンドルを使用してファイルの各行を 1 つずつ読み取ります。

代わりに、からファイル名を取得し<STDIN>、それを変数に格納してから、この変数を引数としてサブルーチンに渡します。メインプログラムから:

$file = <STDIN>;
$variable = read_file($file);

モジュールのサブルーチンは次のとおりです。

#!/usr/bin/perl
use strict; use warnings;

use lib '/usr/local/custom_pm'
package Read_FH

# subroutine that parses the file
sub read_file {
my ($file)= @_;
# !!! Should I open $file here with a file handle? !!!!

# read each line of the file
while($file){
# do something
}

誰も私がこれを行う方法を知っていますか? 提案をいただければ幸いです。

4

2 に答える 2

6

一般に、レキシカル ファイル ハンドラを使用することをお勧めします。これは、ベアワードの代わりにファイル ハンドラーを含むレキシカル変数です。

他の変数と同じように渡すことができます。File::Slurpread_fileから使用する場合、別のファイル ハンドラは必要ありません。コンテンツを変数に丸呑みします。

開いているファイル ハンドルをできるだけ早く閉じることも良い方法であるため、本当に完全なファイル コンテンツのみを取得する必要がある場合は、この方法をお勧めします。

File::Slurp の場合:

use strict;
use warnings;
use autodie;
use File::Slurp;

sub my_slurp {
    my ($fname) = @_;
    my $content = read_file($fname);

    print $content; # or do something else with $content

    return 1;
}

my $filename = <STDIN>;
my_slurp($filename);

exit 0;

追加モジュールなし:

use strict;
use warnings;
use autodie;

sub my_handle {
    my ($handle) = @_;
    my $content = '';

    ## slurp mode
    {
        local $/;
        $content = <$handle>
    }

    ## or line wise
    #while (my $line = <$handle>){
    #    $content .= $line;
    #}

    print $content; # or do something else with $content

    return 1;
}

my $filename = <STDIN>;
open my $fh, '<', $filename;
my_handle($fh); # pass the handle around
close $fh;

exit 0;
于 2012-06-19T18:15:53.537 に答える
3

私は @mugen kenichi に同意します。彼のソリューションは、独自のソリューションを構築するよりも優れた方法です。多くの場合、コミュニティがテストしたものを使用することをお勧めします。とにかく、ここにあなたが望むようにするためにあなた自身のプログラムに加えることができる変更があります.

#/usr/bin/perl
use strict; use warnings;

package Read_FH;

sub read_file {
    my $filein = <STDIN>;
    chomp $filein; # Remove the newline at the end
    open my $fh, '<', $filein or die "could not open $filein for read\n";
    # reads each line of the file text one by one
    my $content = '';
    while (<$fh>) {
        # do something
        $content .= $_;
    }
    close $fh;

    return $content;
}

# This part only for illustration
package main;

print Read_FH::read_file();

実行すると、次のようになります。

simbabque@geektour:~/scratch$ cat test
this is a
testfile

with blank lines.
simbabque@geektour:~/scratch$ perl test.pl
test
this is a
testfile

with blank lines.
于 2012-06-19T18:23:28.370 に答える