2014-10-15 3 views
0

이 스크립트를 작성하여 스크립트를 실행하는 사용자의 기본 웹 사이트를 만들었습니다. 그것은 Windows 또는 유닉스 시스템에서 할 수 있지만, 어떤 이유로 파일이 열리지 않습니다.Windows의 Perl이 파일을 열 수 없음

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

#createSite.pl 

#Attributes 
my $sys; 
my $user; 
my $site; 
my $cgistuff = CGI->new; 

#Subroutine for checking system. 
sub checkSys { 

    if ($ARGV[0] eq "-w") { 
     $sys = "\\"; 
    } elsif ($ARGV[0] eq "-l") { 
     $sys = "/"; 
    } else { 
     print "System not defined please use -w or -l flag for Windows or Linux\n\n"; 
    } 

    #Obtains user name based on user input. 
    print "What would you like your user name to be: "; 
    $user = <STDIN>; 
    chomp($user); 
    $user = lc($user); 

    #Obtains site name based on user input. 
    print "What would you like your site/domain to be called: "; 
    $site = <STDIN>; 
    chomp($site); 
    $site = lc($site); 

    #Debug for printing user name and site name 
    print "Username: $user, Site/Domain: $site\n"; 

    #After checking what system the user is on create file structure. 
    createFS(); 
} 

#Subroutine for file structure creation. 
sub createFS { 
    my $rootDir; 

    if ($sys eq "\\") { 
     $rootDir = 'mkdir ' . 'C:\\inetpub\\wwwroot\\~' . $user . $sys; 
    } elsif ($sys eq "/") { 
     $rootDir = 'mkdir /var/www/html/~' . $user . $sys; 
    } 
    system($rootDir); 
    picDir(); 
    databaseDir(); 
    mailDir(); 
    createPage(); 
} 

#Subroutine to create use OBwebsite. 
sub createPage { 
    if ($sys eq "\\") { 
     system("echo> C:\\Inetpub\\wwwroot\\~" . $user . "\\index.html"); 
     open(WEBFILE, ">", "C:\\Inetpub\\wwwroot\\~" . $user . "\\index.html") 
      or die "index.html could not be opened.\n"; 
    } elsif ($sys eq "/") { 
     system("touch /var/www/html/~" . $user . "/index.html"); 
     open(WEBFILE, ">", "/var/www/html/~" . $user . "/index.html") 
      or die "index.html could not be opened.\n"; 
    } 

    print WEBFILE $cgistuff->start_html(), $cgistuff->h1("Welcome $user!!!"), $cgistuff->end_html; 

    close WEBFILE; 
} 

#Subroutine for creation of Pictures Directory. 
sub picDir { 
    my $picDir; 

    if ($sys eq "\\") { 
     $picDir = 'mkdir C:\\Inetpub\\wwwroot\\~' . $user . '\\pictures'; 
    } elsif ($sys eq "/") { 
     $picDir = 'mkdir /var/www/html/~' . $user . '/pictures'; 
    } 
    system($picDir); 
} 

#Subroutine for creation of Database Directory. 
sub databaseDir { 
    my $dbDir; 

    if ($sys eq "\\") { 
     $dbDir = 'mkdir ' . 'C:\\Inetpub\\wwwroot\\~' . $user . '\\database'; 
    } elsif ($sys eq "/") { 
     $dbDir = 'mkdir /var/www/html/~' . $user . '/database'; 
    } 
    system($dbDir); 
} 

#Subroutine for creation of Mail Directory. 
sub mailDir { 
    my $mailDir; 

    if ($sys eq "\\") { 
     $mailDir = 'mkdir C:\\Inetpub\\wwwroot\\~' . $user . '\\mail'; 
    } elsif ($sys eq "/") { 
     $mailDir = 'mkdir /var/www/html/~' . $user . '/mail'; 
    } 
    system($mailDir); 
} 

#Actions happen here. 
checkSys(); 

스택 오버플로가 숙제를 넣을 장소가 아니라는 것을 알고 있지만 왜 이런 식으로 작동하지 않는지 잘 모르겠습니다.

+3

을 추천합니다! ' :'my $ fh ','<', $ file 또는 die "$ file : $!";'일반적으로 어휘 파일 핸들 (예 :'my $ fh')과' 내가 여기서했던 것처럼. – ThisSuitIsBlackNot

답변

1

이것은 CGI 스크립트가 아니므로 CGI 모듈 ("CGI.pm"이라고 부름)을 사용하는 것은 의미가 없습니다. 이것이 귀하의 문제의 근원입니다.

CGI 호출에서 데이터가 STDIN을 통해 전송되는 경우가 있습니다. 이 데이터는 텍스트가 아니므로 CGI.pm은 binmode(STDIN);을 사용하여 무결성을 보존합니다.

이것은 STDIN에서 한 줄을 읽을 때 CRLF가 더 길게 LF로 변환되므로 chomp 뒤에 변수에 후행 CR이 남음을 의미합니다. 당신이 CGI.pm을 계속 사용하려면

는 해결 방법은 미래를 위해 더 나은 아직

$var =~ s/\s+\z//; 

대신

chomp($var); 

$var =~ s/\r?\n\z//; 

또는를 사용하는 것입니다 참조, 당신이 제일 먼저하는 일 ould는 오류 메시지에 을 포함하여 어떤 오류 open이 반환했는지 확인합니다. 이 문제를 드러내는 오류 메시지에 open에 전달한 파일 이름도 포함시키는 것이 좋습니다.

당신이 변수가 실제로 포함 된 무슨 생각이 들어 있는지 확인해야 할 경우`open`, 당신은 $`에서 실패의 원인에 대한 유용한 정보를 얻을 수 있습니다 실패하면, 나는

use Data::Dumper; 
{ local $Data::Dumper::Useqq = 1; print(Dumper($var)); } 
+0

CGI.pm을 사용하지 않아야하는 이유는 HTML을 생성하고 객체화하여 HTML을 작성한 다음 파일로 인쇄 할 수 있기 때문입니다. 알려진 상식에 따라 CGI로 작동하지 않을 수도 있지만 적은 코드로 과제에 필요한 것을 정확히 수행합니다! 나는 창문에서 CRLF를 완전히 잊었다. 감사! –

+0

그냥 반복하지만 CGI.pm 스크립트가 아니기 때문에 해킹을 사용하여 CGI.pm을 제대로 작동시키지 않아야합니다. – ikegami

관련 문제