my $tempvalue = "c:/reports/check/test.txt";
my @split = split( '/',$tempValue );
$split[$#split] = $/"design.".$1/e;
print "\t",join( '/',@split ),"\; \\\n" ;
Please suggest me a better way of doing this.
so the result should look like c:/reports/check/design.test.txt
Thanks in advance.
Update: ok, an example:
#!/usr/bin/perl use strict; use warnings; use File::Basename qw( fileparse ); my $tempvalue = 'c:/reports/check/test.txt'; my ($name, $path) = fileparse($tempvalue); my $designvalue = $path . "design." . $name; print "'$tempvalue' => '$designvalue'\n"; __END__ 'c:/reports/check/test.txt' => 'c:/reports/check/design.test.txt'
Flavio
perl -ple'$_=reverse' <<
You can use the module [CPAN://File::Basename] to accomplish your requirement
use File::Basename; my $tempvalue = "c:/reports/check/test.txt"; $file = basename($tempvalue); $path = dirname($tempvalue); $fullpath = $path.'/'.design.$file; print "$fullpath\n";
Prasad
I would suggest using [mod://File::Basename]:
use File::Basename;
my $path = 'c:/reports/check/test.txt';
fileparse_set_fstype('MSWin32'); # or is it 'MSDOS'?
my ($name, $base, $suffix) = fileparse($path, '.txt');
$name = 'design.' . $name;
print join '', $base, $name, $suffix, "\n";
If you know you're not going to be changing platforms or needing the flexibility of a directory path splitter that handles different directory seperator characters (i.e. \ on Windows and / on Unix etc) and just want something fast and simple you could use something like this instead:
my $tempvalue = "c:/reports/check/test.txt"; my @split = split( '/', $tempvalue ); my $file = pop @split; print "\t", join( '/', @split ), "/design.$file\n";
OTOH, you're definitively right on the fast side:
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw( cmpthese );
my $tempvalue = 'c:/reports/check/test.txt';
cmpthese( -5, {
file_basename => sub { file_basename($tempvalue); },
fast_and_simple => sub { fast_and_simple($tempvalue); },
});
sub file_basename {
my $tempvalue = shift;
require File::Basename; # Hits performance only once
my ($name, $path) = File::Basename::fileparse($tempvalue);
return $path . "design." . $name;
}
sub fast_and_simple {
my $tempvalue = shift;
my @split = split( '/', $tempvalue );
my $file = pop @split;
return join '/', @split, "design.$file";
}
__END__
Rate file_basename fast_and_simple
file_basename 74479/s -- -58%
fast_and_simple 175981/s 136% --
I dared to make the necessary modifications to your code in order to put it into the benchmark :)
Flavio
perl -ple'$_=reverse' <<
perlmonks.org content © perlmonks.org and Anonymous Monk, Fang, frodo72, prasadbabu, serf, smokemachine
prlmnks.org © 2006 edmund von der burg (eccles & toad)
v 0.03