2013-05-08 2 views
0

Мой скрипт Perl пытается взять аргумент командной строки, который является именем файла, таким как name.txt или hello.txt.exe, и проанализировать расширение файла на основе. разделитель и напечатать только расширение, например exe или txt. Вот что я сейчас имею, что ничего не печатает, и я не совсем понимаю, почему.Разбиение и печать с помощью Perl

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

+0

вам нужно распаковать ARGV, скорее всего, ваш просто получить длину. 'my ($ user_arg) = @ARGV;' – erickb

+0

Я добавил круглые скобки и ничего не изменилось. – 2013-05-08 02:36:26

+0

@ JohnnyDiamond08, ​​потому что ваш 'split' ошибочен. – chrsblck

ответ

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 может облегчить вашу жизнь. Хотя это может быть излишним.

UPDATE

Вы должны быть в состоянии интегрировать это самостоятельно. В вашем случае вам не понадобится цикл над списком файлов, у вас его будет только один.

Это не делает то, что вы хотите, где печатает «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 
+0

+1 для объяснения И подсказка (повторно) использовать существующий код! – lexu

Смежные вопросы