0

我的 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 一次,除非它是我想要的 name.txt.exe它打印 .txt.exe 然后打印 .exe

4

1 回答 1

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
于 2013-05-08T02:36:07.910 回答