Как прочитать файл из папки по полному имени файла в Perl - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть сценарий Perl, и я указываю местоположение и имя входного файла и выходного файла на терминале

./R.pl  <input file>  <output file>

Я пытаюсь написать программу на Perl, которая может принимать имя файла каквведите и выполните некоторую функцию и сгенерируйте вывод в заданной папке.

Это мой Perl-скрипт: -

my $input_file = $ARGV[0]
or die "usage: $0 <input file> <output file>\n";
my $output_file = $ARGV[1]
or die "usage: $0 <input file> <output file>\n";
use File::Basename;
$fullspec = $ARGV[0];
my($files,$dir) = fileparse($fullspec);
print "Directory: " . $dir . "\n";
print "File:" . $files . "\n";
chomp($CEL_dir = $dir);
opendir (DIR, "$CEL_dir") or die "Couldn't open directory $CEL_dir";
$cel_files = $CEL_dir."/cel_files.txt";
open(CEL,">$cel_files")|| die "cannot open $file to write";
print CEL "cel_files\n";

use File::Find;

my @wanted_files;
find(
 sub{ 
     -f $_ && $_ =~ $files  
           && push @wanted_files,$File::Find::name
 }, "."
 );

 foreach(@wanted_files){
 print CEL $CEL_dir."$_\n";
 }close (CEL);

Но он выдает ошибку: -

FATAL ERROR:Error opening cel file: /media/home/folder
/./44754.CEL
Read 2 cel files from: cel_files.txt

FATAL ERROR:Can't read file: '/media/home/folder
/./folder/44754.CEL'

где я не прав или какие изменения требуются в этом скрипте.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

После удаления $ CEL_dir работает как положено

use File::Find;
my @wanted_files;
find(
 sub{ 
     -f $_ && $_ =~ $files  
           && push @wanted_files,$File::Find::name
 },"$ARGV[0]"
);

foreach(@wanted_files){
print CEL "$_\n"; # remove $CEL_dir
}close (CEL);
0 голосов
/ 11 февраля 2019

Я собираюсь игнорировать все вещи из кода OP, которые кажутся ненужными.

Вместо этого мой ответ концентрируется на единственном фрагменте, который на самом деле, кажется, что-то делает: анонимная функция, переданная find().Исходя из этого, я определяю, что OP хочет искать файлы с тем же именем, которое указано в командной строке, начиная с текущего каталога.

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

use File::Find;

my($match) = @ARGV;
die "usage: $0 <file name to match>\n"
    unless defined $match;

# file search
find({
        wanted   => sub {
            print "$File::Find::name\n"
                if (-f $_) && ($_ eq $match);
        },
     },
     '.'
);

exit 0;

Пример использования:

$ ./R.pl some_file_name_to_find >cel_files.txt

Остается вопрос: ПОЧЕМУ? То же можно сделать в командной строке оболочки с помощью:

$ find . -type f -name some_file_name_to_find >cel_files.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...