使用Perl进行拆分和打印

时间:2013-05-08 02:24:43

标签: perl printing

我的Perl脚本正在尝试接受一个命令行参数,该参数是一个文件名,例如name.txt或hello.txt.exe,并根据该文件扩展出来解析文件扩展名。分隔符,只打印像exe或txt这样的扩展名。这是我目前所拥有的不打印任何东西,我不完全确定原因。

usr/bin/perl -w
use  strict;

my ($user_arg) = shift @ARGV;

my ($ext); 

if ( ($ext) = $user_arg =~ /(\.[^.].+)$/) 
{

    print "Ends in ", ($ext) = $user_arg =~ /(\.[^.].+)$/ , "\n";
    print "Ends in" , ($ext) = $user_arg =~ /(\.[^.]+)$/, "\n";


}
elsif( ($ext) = $user_arg =~ /(\.[^.]+)$/)
{ 
    print"Ends in " , ($ext), "\n";

}
else
{
    print "No Extension";

}

*更新了,现在我的问题是第一个语句会打印这两个条件,如果它像name.txt那样会打印.txt两次,我希望它只打印.txt一次除非它的名称.txt.exe我在哪里我希望打印.txt.exe然后.exe

1 个答案:

答案 0 :(得分:3)

这里有两个主要问题:

1)您需要shift关闭@ARGV

my $arg = shift @ARGV;

2)你需要逃避'点'

my @values = split /\./, $user_arg;

其他事情......

您通常希望清理用户输入:

 die "usage: $0 filename\n" if {some condition}

我认为你的意思是chomp $val;中的foreach

熟悉File::Basename并不会有害,fileparse可以让您的生活更轻松。虽然这里可能有点矫枉过正。

<强>更新

你应该能够自己整合这个。在您的情况下,您将不需要循环 在一个文件列表中,你只需要一个。

在打印“txt.exe”,“exe”的地方,这不能做你想要的。但你可以根据自己的喜好对其进行微调。

my @file_tests = qw(nosuffix testfile.txt /path/to/file.exe foo.bar.baz);

for my $fullname (@file_tests) {

    my @names = split /\./, $fullname;
    # shift off the first element, which will
    # give you the list of suffixs or an empty list
    shift @names;

    # you can decide how you want to print this list
    # if scalar @names is 0 don't print anything
    print "list of suffixes: " . join( ', ', @names ) . "\n"
        if scalar(@names) > 0;
}

输出:

list of suffixes: txt
list of suffixes: exe
list of suffixes: bar, baz