Jak mogę zapisać płytę CD w katalogu za pomocą Perla?


Próbuję wykonać następujące czynności ...
systemowy „cd directoryfolder”
ale to się nie udaje, również próbuję opuścić system terminala "wyjście", ale to się nie udaje.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Kod:
chdir('path/to/dir') or die "$!";

Perldoc:
chdir EXPR
chdir FILEHANDLE
chdir DIRHANDLE
chdir Changes the working directory to EXPR, if possible. If EXPR is omitted,
changes to the directory specified by $ENV{HOME}, if set; if not, changes to
the directory specified by $ENV{LOGDIR}. (Under VMS, the variable
$ENV{SYS$LOGIN} is also checked, and used if it is set.) If neither is set,
"chdir" does nothing. It returns true upon success, false otherwise. See the
example under "die". On systems that support fchdir, you might pass a file handle or directory
handle as argument. On systems that don't support fchdir, passing handles
produces a fatal error at run time.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Powodem, dla którego nie możesz tego zrobić, dzwoniąc do
system
, jest to, że
system
rozpocznie nowy proces, wykona polecenie i zwróci kod zakończenia. Więc kiedy wywołujesz
system „cd foo”
, uruchamiasz proces powłoki, który przełącza się do katalogu „foo”, a następnie kończy działanie. W twoim skrypcie Perla nie wydarzy się nic znaczącego. Podobnie
"wyjście" systemu
rozpocznie nowy proces i natychmiast zakończy pracę.
To, czego potrzebujesz do pudełka na CD, to, jak wskazuje Bob, funkcja
chdir
. Istnieje funkcja
exit
umożliwiająca wyjście z programu.
Jednak żadne z nich nie wpłynie na stan sesji terminala, w którym się znajdujesz. Po zakończeniu działania skryptu perl, katalog roboczy terminala będzie taki sam, jak poprzednio, i nie możesz wyjść z sesji terminala, wywołując
exit
w swoim skrypcie perl.
Dzieje się tak, ponieważ skrypt perla jest ponownie oddzielnym procesem od powłoki terminala, a rzeczy, które mają miejsce w oddzielnych procesach, zwykle nie kolidują ze sobą. To jest funkcja, a nie błąd.
Jeśli chcesz coś zmienić w swoim środowisku powłoki, musisz wydać instrukcje, które zostaną zrozumiane i zinterpretowane przez Twoją powłokę.
cd
to to samo polecenie wbudowane w powłokę, co
exit . 
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zawsze lubię wspominać
File::chdir
http://p3rl.org/File%3a%3achdir
dla
cd
-ing. Pozwala na dokonywanie zmian w katalogu roboczym, który jest lokalny dla otaczającego bloku.
Jak wspomina Peder, twój skrypt to w zasadzie wszystkie wywołania systemowe związane z Perlem. Przedstawiam więcej implementacji Perla.
"wget download.com/download.zip"; 
system "unzip download.zip"
chdir('download') or die "$!";
system "sh install.sh";

staje się:
#!/usr/bin/env perluse strict;
use warnings;use LWP::Simple; #provides getstore
use File::chdir; #provides $CWD variable for manipulating working directory
use Archive::Extract;#download
my $rc = getstore('download.com/download.zip', 'download.zip');
die "Download error $rc" if ( is_error($rc) );#create archive object and extract it
my $archive = Archive::Extract->new( archive => 'download.zip' );
$archive->extract() or die "Cannot extract file";{
#chdir into download directory
#this action is local to the block (i.e. {})
local $CWD = 'download';
system "sh install.sh";
die "Install error $!" if ($?);
}#back to original working directory here

Używa to dwóch nie-rdzeniowych modułów (a
Archive :: Extract
był tylko rdzeniem od Perla v5.9.5), więc może być konieczne ich zainstalowanie. Aby to zrobić, użyj narzędzia
cpan
(lub
ppm
w AS-Perl).

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się