2017-02-14 22 views
-3

Я пытаюсь создать простую программу, которая делает эти пять вещейTrouble запрашивая пользователя для входного файла, и возвращается с серией информации [Perl]

  1. запрашивает у пользователя входного файла.
  2. Запрашивает файл пользователя не существует, если пользователь указывает неизвестный документ (случай 1)
  3. Файл не является обычным файлом (случай 2)
  4. Существует проблема с открытием файла, что пользователь имеет (Случай 3)
  5. Указанный файл имеет (1) данные, которые не являются допустимым числом, или (2) более одного номера в строке. (Случай 4)
  6. Файл существует и может быть открыт без ошибок. Файл должен содержать одно число (любое десятичное или отрицательное/целое число) и вычислять сумму, количество чисел в файле и среднее/среднее (случай 5).

Я обозначил случаи кода, который я предоставляю. Каждый раз, когда я запускаю это, я не получаю ошибок, но тот же ответ в ответ. Я пытаюсь улучшить свои навыки сканирования файлов. Если у кого-нибудь есть какие-либо знания по этой теме, я был бы более чем благодарен. Заранее спасибо.

#!/usr/bin/perl 

use strict; 
use warnings; 

print ("Enter a file name: "); 

my $infile = <STDIN>; #Prompts the user for input 
chomp ($infile); #Chomps the $infile Variable. 

#****CASE ONE**** 
if (-e $infile) { 

     print ("File '$infile' does not exist.\n"); 
      exit; 
} 

#****CASE TWO**** 
elsif (-f $infile) { 

     print ("Not a regular file or directory.\n"); 
      exit; 
} 

#****CASE THREE**** 
open (my $input, '<', $infile) or die $!; 
print ("Can not open input file '$infile': Permission denied. "); 

#****CASE FOUR**** 

#for (my $inf = 1; ; ++$_) 
my $inf = 9**9**9; 

if (-e $infile =~ /^[a-zA-Z]+$/) { 

    } else { 
     print ("File '$infile' containts invalid data.\n"); 
      exit; 
} 

#****Case Five**** 
my $Int_Pos = 0; 
my $Int_Neg = 0; 
my $Int_Dec = 0; 

open(FHIN, '<', $infile); #Opens the file prompted by user. 
my @lines = <FHIN>; #Variable storing the number of lines in the file. 
chomp(@lines); 
close(FHIN); #File handle is closed. 

while (my $line = <$input>) { #iterates the file line by line, making $_ as teh defaule variable. 
    $Int_Pos++ if $line >= 0; 
    $Int_Neg++ if $line >= 0; 
    $Int_Dec++ if $line >= 0; 
    my $sum = $Int_Pos + $Int_Neg + $Int_Dec; 
    my $Observations = @lines; 
    my $Mean = $sum/3; 

    print ("Sum: '$sum'\n"); 
    print ("Observations: '$Observations'\n"); 
    print ("Mean: '$Mean'\n"); 
} 
+1

* «Каждый раз, когда я запускаю это, я не получаю ошибок, но тот же ответ в ответ». * И какой ответ? Предположительно «Файл не существует» для файлов, которые действительно существуют, и «Нет такого файла или каталога» для файлов, которые не существуют. Ваша логика все в порядке: '-e' и' -f' означает, что файл * существует *, вы печатаете «Permission denied» после успешного открытия файлов и т. Д. – ThisSuitIsBlackNot

+0

Да; Я получаю «File doe not exist» в качестве моего возвращения.Как я буду использовать операторы -e и -f наоборот (если файл фактически не существует, он возвращает правильное сообщение)? –

+1

* «Файл должен содержать одно число ... и вычислять сумму, количество чисел в файле и среднее/среднее значение» * Вы хотите рассчитать сумму и среднее значение * одного номера *? – Borodin

ответ

-1

Вы используете $ INFILE в качестве входных

#****CASE THREE**** 
open (my $input, '<', $infile) or die $!; 

Я хотел бы сделать что-то вроде этого ...

open (my $input, '<', "somefile.txt") or die $!; 


+0

Это добавляет совершенно новый мир ошибок. –

+0

дело с каждой ошибкой, я просто дал вам отправную точку для вашей домашней работы –

+1

Эта часть кода OP на самом деле прекрасна. Они хотят открыть файл, указанный пользователем, а не жестко запрограммированное имя файла. – ThisSuitIsBlackNot

0

хорошо, так что ошибочны:

if (-e $infile) должен быть

`if (not -e $infile) ` 

elsif (-f $infile) имеет тот же вопрос тестирования противоположное тому, что вы хотите elsif (not -f $infile)

также, эта печать будет происходить, когда файл открывается: `

open (my $input, '<', $infile) or die $!; 
print ("Can not open input file '$infile': Permission denied. ");` 

вместо этого изменить его на:

`open (my $input, '<', $infile) or die("Can not open input file '$infile': $!");` 

эта линия нонсенс if (-e $infile =~ /^[a-zA-Z]+$/) им угадать в случае 4 Вы хотите что-то вдоль линий foreach $line (<$infile >){ $matches =() = $line =~ /^(\d+)$/; if($matches != 1){ die "line does not contain a single number"; } $sum += $1; }

это поспешное, приблизительный код, который не использует строгий (вы должны использовать строго!), Который должен помочь вам разобраться в остальном