Chinaunix

标题: 抓取文件名 [打印本页]

作者: tingshuibanxia    时间: 2016-08-23 09:50
标题: 抓取文件名
本帖最后由 tingshuibanxia 于 2016-08-23 13:18 编辑

大家好!

在目录:/home/perl/  下有一系列文件:X4.scv
                                                    X1.scv
                                                     X22.scv
                                                     test
                                                     1.pl


想要抓取*.scv文件的前缀,用于后续分析,
写了一个脚本,请大神帮忙看看:



  1. #!/usr/bin/perl -w
  2. use strict;

  3. my @files = glob("/home/perl/*.scv");
  4. foreach my $file(sort @files){
  5.         my $ID =$file=~m/\w+\/;
  6.         print $ID;
  7. }


复制代码


输出: X1  X4 X22

作者: stanley_tam    时间: 2016-08-23 11:09
试试?
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my @files = glob("/home/perl/*.scv");
  4. foreach my $file(sort @files){
  5.         my ($ID) = $file =~ m{/home/perl/([^.]+)\.};
  6.         print "$ID$/";
  7. }
复制代码

作者: tingshuibanxia    时间: 2016-08-23 13:17
似乎有点问题,不知道这种从变量中来匹配的正则表达怎么写啊啊啊啊
作者: sunzhiguolu    时间: 2016-08-23 14:33
试下 File::Basename 模块中的 basename 方法:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use File::Basename;

  5. foreach (glob ('./*.scv')){
  6.     my $basename = basename ($_, '.scv');
  7.     print "$basename\n";
  8. }
复制代码

作者: sunzhiguolu    时间: 2016-08-23 15:29
my ($ID) = $1 if ($file =~ m/(\w+)\./);    # $file => X4.scv
(\w+) => X4
\.        => .
作者: stanley_tam    时间: 2016-08-23 17:04
额,那就用命令吧
  1. ls /home/perl/*.scv | cut -f4 -d / | cut -f 1 -d .
复制代码

回复 3# tingshuibanxia



作者: 104359176    时间: 2016-08-23 21:05
看到目录, 我就想到用 File::Find::Wanted qw(find_wanted); 这个模块提供的方法能够找出子目录中所有的文件, 自动过滤目录. 取文件名用 File::Basename;
这样这个代码即使处理别的文件夹, 或者嵌套包含文件夹的文件夹, 都能重用了.

  1. use 5.020;
  2. use File::Basename qw(basename);
  3. use File::Find::Wanted qw(find_wanted);

  4. my @files = find_wanted(sub { /\.csv$/}, ".");
  5. for (@files) {
  6.     say basename($_);
  7. }
  8. # my @sufix_name = map { basename} @files;
复制代码

作者: 华小飞_Perl    时间: 2016-08-23 21:23
回复 7# 104359176
大神说的太棒啦!



作者: 104359176    时间: 2016-08-24 19:09
写了太多无用的代码, 只希望能写点以后可能用到的代码.
作者: RE_HASH    时间: 2016-08-25 02:56
该道隔壁去问shell问题:
$>  echo $(for i in *scv ; do echo ${i%*.scv}; done)
X1 X22 X4


作者: kingfighters    时间: 2016-08-25 23:03
顶七楼!!!
作者: kingfighters    时间: 2016-08-25 23:06
The cynical may say "that's just the same as doing this":

        my @files;
        find( sub { push @files, $File::Find::name if -f && /\.jpg$/ }, $dir );

    Sure it is, but File::Find::Wanted makes it more obvious, and saves a line
    of code. That's worth it to me. I'd like it if find_wanted() made its way
    into the File::Find distro, but for now, this will do.


说的不错,File::Find确实太繁琐了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2