我的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
答案 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