WTem has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I just subscribed here a few minutes ago seeking for help >< I am recently getting into perl for my work since a couple of weeks now. And like not super smart people, there is at least a first time when we need help for something dump ... The problem I'm into is this :

As parameters of a command that I created with perl, the user enter an interface name of a cisco router and his IP adress, then I put them an a variable like $ip = 192.168.1.1 and $interface = POS1/0/0

Now what I want to do is to create a .txt file as follow : $filename = "$ip--$interface.txt" but without "/" (obviously). As a result I should have a file named : 192.168.1.1--POS100.txt

In short, how can I change $interface = "POS1/0/0" into $interface = "POS100" ??

Looks simple saying like this but I really need help in this. Thank you very much for your time and help ^^

Replies are listed 'Best First'.
Re: Delete "/" in a string
by Athanasius (Archbishop) on Oct 23, 2014 at 02:42 UTC
Re: Delete "/" in a string
by AnomalousMonk (Archbishop) on Oct 23, 2014 at 05:20 UTC

    Just a note of caution. I'm not familiar with your use-case, but might simply deleting the  / (forward-slash) delimiters be ambiguous? Consider  'POS1/23/4' versus  'POS12/3/4' etc. Maybe better to replace with an innocuous character (note: no  /d modifier needed here):

    c:\@Work\Perl>perl -wMstrict -le "use 5.014; ;; my $s = 'POS1/23/4'; ;; my $t = $s =~ tr{/}{-}r; print qq{'$s' -> '$t'}; " 'POS1/23/4' -> 'POS1-23-4'

    Update: See  tr/// in Quote-Like Operators section in perlop.

      Very good suggestion indeed ^^

      Thank you so much for your help everybody ^^

Re: Delete "/" in a string
by NetWallah (Canon) on Oct 23, 2014 at 05:00 UTC
    And .. just in case you need yet another, slightly different way ..
    my ($ip,$interface) = qw(192.168.1.1 POS1/0/0); (my $filename = "$ip--$interface.txt")=~tr{/}{}d; # $filename now contains '192.168.1.1--POS100.txt"
    The "tr" operator is slightly more efficient than the s//, and serves the purpose well in this case.

    The "d" option at the end of the operator "d"elete's the un-substituted character ("/") in this case.

    Update: Another advantage of this approach is that it is non-destructive: The content of $interface is not changed - this is not the case with the previous 2 posts first post.

            "You're only given one little spark of madness. You mustn't lose it."         - Robin Williams

      The "tr" operator is slightly more efficient than the s//, and serves the purpose well in this case.

      Although it probably does not make a big difference in this case, the tr/// operator can be considerably more efficient than s///.

      ... advantage ... it is non-destructive ... the previous 2 posts.

      But Loops uses  /r above. (Update: Oops — already noted!)

Re: Delete "/" in a string
by Loops (Curate) on Oct 23, 2014 at 03:22 UTC

    Hi WTem, welcome to the monastery. As with all things Perl, there is more than one way to do this. As long as you have at least Perl 5.14 (which added the /r regex modifier), this will work too and wont touch the original $interface value:

    my ($ip,$interface) = ('192.168.1.1', 'POS1/0/0'); my $filename = sprintf '%s--%s.txt', $ip, $interface =~ s#/##gr; print $filename, "\n";
    will print:
    192.168.1.1--POS100.txt