in reply to Re: Converting python list range expressions to perl
in thread Converting python list range expressions to perl
I'd rather stick with Perl's slice capability since it reads more cleanly (to me, anyway) and doesn't require copying and modifying the source array. Here's how I ended up implementing and testing pyrange():
Output:#!/usr/bin/env perl use v5.36; use constant { AREF => 0, PYTHON => 1, EXP => 2, }; use Test::More; my @test_array = 'a' .. 'g'; my @tests = ( [\@test_array, '[:3]', 'abc'], [\@test_array, '[:-3]', 'abcd'], [\@test_array, '[3:]', 'defg'], [\@test_array, '[-3:]', 'efg'], [\@test_array, '[-3:-1]', 'ef'], # testing double-ended ranges [\@test_array, '[-3:-3]', ''], [\@test_array, '[3:-1]', 'def'], ); plan tests => 0+@tests; for my $test (@tests) { is get_array_slice_by_python_expr($test->@[AREF, PYTHON]), $test->[EXP], "Testing: $test->[PYTHON]"; } sub get_array_slice_by_python_expr ($aref, $python) { ### $re modified to return undef instead of '' when endpoint omitt +ed state $re = qr{^ \[ ( -? \d+ )? : ( -? \d+ )? \] $}x; my ($start, $stop) = $python =~ $re; my $range_aref = pyrange($aref, $start, $stop); return join '', @$range_aref; } sub pyrange($aref, $start=undef, $stop=undef) { if (!defined $start) { $start = 0; } elsif ($start < 0) { $start = @$aref + $start; } if (!defined $stop) { $stop = $#$aref; } elsif ($stop >= 0) { $stop = $stop - 1; } else { $stop = @$aref + $stop - 1; } return [@$aref[$start .. $stop]]; }
$ ./test 1..7 ok 1 - Testing: [:3] ok 2 - Testing: [:-3] ok 3 - Testing: [3:] ok 4 - Testing: [-3:] ok 5 - Testing: [-3:-1] ok 6 - Testing: [-3:-3] ok 7 - Testing: [3:-1]
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Converting python list range expressions to perl
by kcott (Archbishop) on Dec 04, 2022 at 18:45 UTC | |
by ibm1620 (Hermit) on Dec 04, 2022 at 23:22 UTC | |
by kcott (Archbishop) on Dec 05, 2022 at 06:14 UTC | |
by LanX (Saint) on Dec 05, 2022 at 14:23 UTC | |
by kcott (Archbishop) on Dec 05, 2022 at 19:02 UTC | |
| |
by ibm1620 (Hermit) on Dec 05, 2022 at 21:36 UTC | |
by LanX (Saint) on Dec 05, 2022 at 22:11 UTC | |
|