[英]Splitting and printing with Perl
我的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
这里有两个主要问题:
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
可以使您的生活更轻松,这没有什么坏处。 虽然在这里可能会矫kill过正。
更新
您应该可以自己集成此功能。 在您的情况下,您不需要循环遍历文件列表,而只有一个。
这不会按照您想要的方式打印“ 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.