Как настроить оператор open () или die, используя аргумент программы в качестве входных данных? - PullRequest
0 голосов
/ 23 сентября 2019

В моем текущем домашнем задании я пытаюсь открыть файл, используя условие открытия или смерти.Я должен открыть файл, затем построчно перечислить его содержимое, а затем применить к нему регулярное выражение (эта часть сейчас неактуальна).Вот некоторый код пока ...

my $filename = '<>';
open(my $fh, "<", $filename) or die "Could not open file, please enter a proper file handle";

while(<>){
  print $_;
}

close $fh;

Спасибо за помощь, ребята ... Я с нетерпением жду ответа на мою проблему.Я знаю, что это может быть простой ответ, но я все еще новичок в Perl, поэтому что-нибудь ценится.

1 Ответ

2 голосов
/ 23 сентября 2019

@ARGV содержит аргументы программы.

@ARGV == 1
   or die("usage\n");

my ($qfn) = @ARGV;

open(my $fh, "<", $qfn)
   or die("Can't open \"$qfn\": $!\n");

while (<$fh>) {  # Sets $_
   chomp;          # Remove the line feed from $_.
   print("$_\n");  # Re-adds the line feed and prints the line.
}

или

...

while ( my $line = <$fh> ) {
   chomp($line);      # Remove the line feed from $line.
   print("$line\n");  # Re-adds the line feed and prints the line.
}

Дело в том, что Perl имеет специальный дескриптор (ARGV), который читает из файлов, чьипути находятся в @ARGV (или из STDIN, если не были предоставлены аргументы).Это дескриптор по умолчанию, используемый <> (это означает, что <> - это сокращение от <ARGV>), поэтому все, что вам нужно, это следующее:

while (<>) {
   chomp;
   print("$_\n");
}

Технически, все, что вам нужно, этоследующее:

while (<>) {
   print;
}

Вышеуказанное эквивалентно следующему:

print while <>;   # Also one line at a time.

Вы можете даже использовать следующее:

print <>;         # Reads all the lines, then prints them.

Тем не менее, один обычнохочет каким-то образом преобразовать ввод перед его распечаткой, и для этого обычно полезно удалить перевод обучающей строки.


Я назвал переменную qfn для уточненного имени файла, что означает относительный или абсолютныйпуть, который включает имя файла.Это то, что вы действительно принимаете, а не просто имя файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...