LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

有关Perl问题的讨论请到这里

[复制链接]
发表于 2003-11-19 13:50:28 | 显示全部楼层
This script come from internet:

一个简单的FTP镜像脚本,它递归地将一个本地目录和远程目录做比较,,并将新地或更新过的文件拷贝到本地机器,保持目录的结构,脚本在本地拷贝中保持文件的模式,也尽力保持符号链接。

为了从远程服务器镜像文件和目录,以命令行参数调用这个脚本,命令行参数的组成为远程服务器的DNS名字,一个冒号,以及要镜像的文件或目录的路径。下面的例子镜像文件RECENT,只在从最后一次镜像该文件之后且文件又被改变的情况下才将它拷贝到本地目录:
$ftp_mirror.pl ftp.perl.org:/pub/CPAN/RECENT
下一个例子镜像CPAN模块目录的全部内容,递归地将远程目录结构拷贝到当前本地工作目录中(不要逐字地用这条命令,除非你地网络连接非常快速并且你具又很多地FREE磁盘空间);

$ftp_mirror.pl ftp.perl.org:/pub/CPAN

这个脚本地命令行选项包括--user和--pass,为非匿名FTP提供用户和密码;还包括--verbose,获取详细地状态报告;以及--hash,在文件传输过程中打印出散列标记。
----------------start

#!/usr/bin/perl -w
# file: ftp_mirror.pl
# Figure 6.2: Recursively mirroring an FTP directory

use strict;
use Net::FTP;
use File:ath;
use Getopt:ong;

use constant USAGEMSG => <<USAGE;
Usage: ftp_mirror.pl [options] host:/path/to/directory
Options:
        --user  <user>  Login name
        --pass  <pass>  Password
        --hash          Progress reports
        --verbose       Verbose messages
USAGE

my ($USERNAME,$PASS,$VERBOSE,$HASH);

die USAGEMSG unless GetOptions('user=s'  => \$USERNAME,
                               'pass=s'  => \$PASS,
                               'hash'    => \$HASH,
                               'verbose' => \$VERBOSE);
die USAGEMSG unless my ($HOST,$PATH) = $ARGV[0]=~/(.+).+)/;

my $ftp = Net::FTP->new($HOST) or die "Can't connect: $@\n";
$ftp->login($USERNAME,$PASS)   or die "Can't login: ",$ftp->message;
$ftp->binary;
$ftp->hash(1) if $HASH;

do_mirror($PATH);

$ftp->quit;
exit 0;

# top-level entry point for mirroring.
sub do_mirror {
  my $path = shift;

  return unless my $type = find_type($path);

  my ($prefix,$leaf) = $path =~ m!^(.*?)([^/]+)/?$!;
  $ftp->cwd($prefix) if $prefix;

  return get_file($leaf)  if $type eq '-';  # ordinary file
  return get_dir($leaf)   if $type eq 'd';  # directory

  warn "Don't know what to do with a file of type $type. Skipping.";
}

# mirror a file
sub get_file {
  my ($path,$mode) = @_;
  my $rtime = $ftp->mdtm($path);
  my $rsize = $ftp->size($path);
  $mode = (parse_listing($ftp->dir($path)))[2] unless defined $mode;

  my ($lsize,$ltime) = stat($path) ? (stat(_))[7,9] : (0,0);
  if ( defined($rtime) and defined($rsize)
       and ($ltime >= $rtime)
       and ($lsize == $rsize) ) {
    warn "Getting file $path: not newer than local copy.\n" if $VERBOSE;
    return;
  }

  warn "Getting file $path\n" if $VERBOSE;
  $ftp->get($path) or (warn $ftp->message,"\n" and return);
  chmod $mode,$path if $mode;
}

# mirror a directory, recursively
sub get_dir {
  my ($path,$mode) = @_;
  my $localpath = $path;
  -d $localpath or mkpath $localpath or die "mkpath failed: $!";
  chdir $localpath                   or die "can't chdir to $localpath: $!";
  chmod $mode,'.' if $mode;

  my $cwd = $ftp->pwd                or die "can't pwd: ",$ftp->message;
  $ftp->cwd($path)                   or die "can't cwd: ",$ftp->message;

  warn "Getting directory $path/\n" if $VERBOSE;

  foreach ($ftp->dir) {
    next unless my ($type,$name,$mode) = parse_listing($_);
    next if $name =~ /^(\.|\.\.)$/;  # skip . and ..
    get_dir ($name,$mode)    if $type eq 'd';
    get_file($name,$mode)    if $type eq '-';
    make_link($name)         if $type eq 'l';
  }

  $ftp->cwd($cwd)     or die "can't cwd: ",$ftp->message;
  chdir '..';
}

# subroutine to determine whether a path is a directory or a file
sub find_type {
  my $path = shift;
  my $pwd = $ftp->pwd;
  my $type = '-';  # assume plain file
  if ($ftp->cwd($path)) {
    $ftp->cwd($pwd);
    $type = 'd';
  }
  return $type;
}

# Attempt to mirror a link.  Only works on relative targets.
sub make_link {
  my $entry = shift;
  my ($link,$target) = split /\s+->\s+/,$entry;
  return if $target =~ m!^/!;
  warn "Symlinking $link -> $target\n" if $VERBOSE;
  return symlink $target,$link;
}

# parse directory listings
# -rw-r--r--   1 root     root          312 Aug  1  1994 welcome.msg
sub parse_listing {
  my $listing = shift;
  return unless my ($type,$mode,$name) =
    $listing =~ /^([a-z-])([a-z-]{9})  # -rw-r--r--
                 \s+\d*                # 1
                 (?:\s+\w+){2}         # root root
                 \s+\d+                # 312
                 \s+\w+\s+\d+\s+[\d:]+ # Aug 1 1994
                 \s+(.+)               # welcome.msg
                 $/x;           
  return ($type,$name,filemode($mode));
}

# turn symbolic modes into octal
sub filemode {
  my $symbolic = shift;
  my (@modes) = $symbolic =~ /(...)(...)(...)$/g;
  my $result;
  my $multiplier = 1;
  while (my $mode = pop @modes) {
    my $m = 0;
    $m += 1 if $mode =~ /[xsS]/;
    $m += 2 if $mode =~ /w/;
    $m += 4 if $mode =~ /r/;
    $result += $m * $multiplier if $m > 0;
    $multiplier *= 8;
  }
  $result;
}
发表于 2003-11-19 13:55:58 | 显示全部楼层
一个简单的下载单个文件的脚本。来自internet.
#!/usr/bin/perl -w
# file: ftp_recent.pl
# Figure 6.1: Downloading a single file with Net::FTP

use Net::FTP;

use constant HOST => 'ftp.perl.org';
use constant DIR  => '/pub/CPAN';
use constant FILE => 'RECENT';

my $ftp = Net::FTP->new(HOST) or die "Couldn't connect: $@\n";
$ftp->login('anonymous')      or die $ftp->message;
$ftp->cwd(DIR)                or die $ftp->message;
$ftp->get(FILE)               or die $ftp->message;
$ftp->quit;

warn "File retrieved successfully.\n";
发表于 2003-11-19 14:32:58 | 显示全部楼层
来自internet

用FTP下载一个文件。
#!/usr/bin/perl
# File: FTP_download.pl
use CGI ':standard';
use Win32::Internet;

$inet = new Win32::Internet();
$inet->FTP($FTP,'192.69.150.1','mlavery','jukilo0');

$FTP->Ascii();       #set the transfer to ASCII mode;
$FTP->Cd('/nfsexport/phone');
$FTP->Get('phone.txt');
$inet->close;
发表于 2003-11-21 14:26:32 | 显示全部楼层
(转)安装一个perl模块的方法

安装一个模块(如:Crypt::Blowfish 加密功能的)
先在系统上用perldoc Crypt::Blowfish 看模块是否有
如默认没有被安装则去(http://www.perl.com/CPAN/、http ... 该模块(用wget http://search.cpan.org/CPAN/...........)
解压
进入模块目录,看README查是否需要其他模块的支持(本模块需要先安装 Crypt::Rijndael、 Crypt::CBC两个)
安装
1. perl Makefile.PL
2. make
3. make test
4. make install
即可
(可在用perldoc 模块 来验证啊!)
发表于 2003-11-22 14:44:05 | 显示全部楼层
请大家帮看看。。我这程序错在那里?

#!/usr/bin/perl -w
$d=10;
print "\$d\=10\;\n$d\n";
@b=(1,2,3,9);
print "@b\n";
foreach $d (@b)
{
print "$d\n";
}
print "@b\n";

原来是打错单词了。。。。
发表于 2003-12-24 00:02:06 | 显示全部楼层
刚来呢,
感觉~~
风景无限!
发表于 2004-2-21 08:42:03 | 显示全部楼层
$ Perl -MO=Deparse, -p -e '$a=5*6+4;'
($a=34);
-e syntax ok

第一行社么意思特别是加粗的地方

foreach $key(keys %monthstonum)
{
printf "Month $monthstonum{$key} is $key \n};
}

我比较熟悉c,c++所以这个哈希调用keys 是设么意思后面更%monthstonum我不是很清楚

while(<data>)
{
if (s#\\s#)
{
s_.=<data>;
redo;
}
}
那个加起来好奇怪帮我解释一下
发表于 2004-2-21 08:44:34 | 显示全部楼层
my $packtring="a8a4a12ssss1";

my $reclength=length(pack($packstring));

my @uy_types=qw(EMPTY RUN_LVL BOOT_TIEM OLD_TIME NEW_TIME INIT_PROCESS LOGIN_PROCESS USER_PROCESS DEAD_PROCESS ACCOUNTING);

open(D,"</var/adm/wtmp")or die "Couldn't open wtmp,$!";<R

while(sysread(D,my $rec,$reclength))

{

my ($user,$userid,$line,$pid,$type,$eterm,$eexit,$time)

=unpack($packstring,$rec);

print("$user,$userid,$line,$pid,$ut_types[$type],",

"$eterm,$eexit,",scalar localtime($time),"\n");

}

close(D) or die "Couldn't close wtmp,$!";

一句话实在是太看不懂了拜托了,特别是那个D我就想不同那几个符号设么意思
还有就是;号后面的<R设么意思啊我快崩溃了
“反引用“
我看了半天还是搞不明白,谁可以帮忙解释一下大师们啊
发表于 2004-3-26 20:58:25 | 显示全部楼层
最初由 加布 发表
$ Perl -MO=Deparse, -p -e '$a=5*6+4;'
#写完的脚本可以使用Perl的B和O模块对脚本进行转化的,上面是使用内置的编
#译器和优化器对代码优化的意思

($a=34);
-e syntax ok

第一行社么意思特别是加粗的地方

foreach $key(keys %monthstonum)
{
printf "Month $monthstonum{$key} is $key \n};
}

我比较熟悉c,c++所以这个哈希调用keys 是设么意思后面更%monthstonum我不是很清楚

#%hash是一种C/C++里面没有的数据类型,是建立在键=>值的散列数组,我举个简单的列子
#           #!/usr/bin/perl -w
#           %hash = (
#           one => 'I am one',
#           two => 'I am two',
#           three => 'I am three'
#           );

#           print $hash{'one'};#输出 I am one
#           keys(%monthstonum)返回所有的%monthstonum键

while(<data>)
{
if (s#\\s#)
{
s_.=<data>;#连接所有符合s#\\s#结构的行
redo;
}
}
那个加起来好奇怪帮我解释一下
发表于 2004-3-26 21:08:43 | 显示全部楼层
最初由 加布 发表
my $packtring="a8a4a12ssss1";

my $reclength=length(pack($packstring));

my @uy_types=qw(EMPTY RUN_LVL BOOT_TIEM OLD_TIME NEW_TIME INIT_PROCESS LOGIN_PROCESS USER_PROCESS DEAD_PROCESS ACCOUNTING);

open(D,"</var/adm/wtmp")or die "Couldn't open wtmp,$!";<R

while(sysread(D,my $rec,$reclength))

{

my ($user,$userid,$line,$pid,$type,$eterm,$eexit,$time)

=unpack($packstring,$rec);

print("$user,$userid,$line,$pid,$ut_types[$type],",

"$eterm,$eexit,",scalar localtime($time),"\n");

}

close(D) or die "Couldn't close wtmp,$!";

一句话实在是太看不懂了拜托了,特别是那个D我就想不同那几个符号设么意思
还有就是;号后面的<R设么意思啊我快崩溃了
“反引用“
我看了半天还是搞不明白,谁可以帮忙解释一下大师们啊


open(D,"</var/adm/wtmp")or die "Couldn't open wtmp,$!";<R
是以读方式打开文件/var/adm/wtmp(其中D是文件句柄,相当于读的管道的名称),如果某种原因没有打开的话,跳出并且提示;

执行完毕了,设置在调试器提示前的Perl命令为R

“反引用“ 就是引用的反过来,如果是有一个是引用,例如:
%hash = (
one => 'I am one',
two => 'I am two',
three => 'I am three'
);

$ref = \%hash;
那么,$ref->{'one'}就是反引用了(值为‘I am one’),一般是用来求值的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表