bug-gawk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: delete of nested array is in consistent


From: Denis Shirokov
Subject: Re: delete of nested array is in consistent
Date: Fri, 24 Apr 2020 01:17:06 +0300

I remember that defining subarrays by delete statement was been
already discussed between me and Arnold in the year 2013.
the answer was the same :)

however: if you want to feel yourself good while defining(and
providing) subarrays you may use special functions like:


func _defa( i, A ) { #define empty subarray

    delete A[ i ]

    delete A[ i ][ A[ i ][ "" ] ]

    return i }

.... split( t, A[ _defa( ".", A ) ], "" )....

split will use subarray A[ "." ] as the destination array.
pay attention that A may never used before.


another useful function is _leta():


func _leta( i, A ) { #define subarray i if it's not already defined; return i

    if ( i in A ) {

        if ( isarray( A[ i ] ) )

            return i

        delete A[ i ] }

    delete A[ i ][ A[ i ][ "" ] ]

    return i }

if you want to provide subarray (possibly: not empty or not defined) then
you just doing it like:

        ARRAY[ _leta( index, ARRAY ) ]



2020-04-19 11:48 GMT+03:00, address@hidden <address@hidden>:
> You are, of course, welcome to your opinion.  But simply stating
> it on the bug list is not actually going to effect any changes.
>
> Here is an incomplete list of possible things you might do to change
> things:
>
> A. Switch from gawk to Python for all your programming. This is
> recommended.
>
> B. Failing (A), learn C, read the gawk code, and develop a patch to
> submit for review.
>
> C. Failing (B), find someone else to do that for you.
>
> D. Failing (C), talk to me offline about my consulting rates.
>
> Arnold
>
> Peng Yu <address@hidden> wrote:
>
>> I feel if `delete a[“”]` can initialize the array, it should be intuitive
>> to support `delete a[1][“”]` as well. The definition of the language
>> should
>> be separated from the difficulties in the implementation.
>>
>> On Fri, Apr 17, 2020 at 8:46 AM <address@hidden> wrote:
>>
>> > I poked at this in a debugger. Basically for
>> >
>> >         BEGIN { delete a[1][""]; print typeof(a[1]) }
>> >
>> > a[1] never existed as a defined array, just as a[1][""] doesn't have
>> > any
>> > value associated with it.  Thus the delete effectively does nothing.
>> >
>> > So, when typeof() is called on a[1], it reports undefined, since no
>> > direct
>> > assignment was ever made to it.
>> >
>> > Andy's suggestion:
>> >
>> >         BEGIN { a[1][""]; delete a[1][""]; print typeof(a[1]) }
>> >
>> > is the right way to go to force gawk to create a[1] and make it
>> > into an array.
>> >
>> > Forcing that creation from within the delete statement is way too
>> > hard to do, and definitely much less clear at the awk level as to
>> > what's going on anyway.
>> >
>> > Arnold
>> >
>> > "Andrew J. Schorr" <address@hidden> wrote:
>> >
>> > > On Fri, Apr 17, 2020 at 01:26:17AM -0600, address@hidden wrote:
>> > > > Peng Yu <address@hidden> wrote:
>> > > >
>> > > > > See below. I'd expect the second one should also print array. Is
>> > > > > it
>> > a bug?
>> > > > >
>> > > > > $ awk -e 'BEGIN { delete a[""]; print typeof(a) }'
>> > > > > array
>> > > > > $ awk -e 'BEGIN { delete a[1][""]; print typeof(a[1]) }'
>> > > > > unassigned
>> > > > >
>> > > > > --
>> > > > > Regards,
>> > > > > Peng
>> > > >
>> > > > Upgrade your version of gawk:
>> > > >
>> > > > $ ./gawk --version | sed 2q
>> > > > GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
>> > > > Copyright (C) 1989, 1991-2020 Free Software Foundation.
>> > > > $ ./gawk 'BEGIN { delete a[""]; print typeof(a) }'
>> > > > array
>> > > > $ ./gawk 'BEGIN { delete a[1][""]; print typeof(a) }'
>> > > > array
>> > >
>> > > Actually, in latest gawk, his second example still says unassigned:
>> > >
>> > > bash-4.2$ ./gawk --version | head -1
>> > > GNU Awk 5.1.0, API: 3.0 (GNU MPFR 3.1.1, GNU MP 6.0.0)
>> > > bash-4.2$ ./gawk 'BEGIN { delete a[1][""]; print typeof(a[1]) }'
>> > > unassigned
>> > >
>> > > This gives the desired outcome:
>> > > bash-4.2$ ./gawk 'BEGIN { a[1][""]; delete a[1][""]; print
>> > > typeof(a[1])
>> > }'
>> > > array
>> > >
>> > > Regards,
>> > > Andy
>> >
>> > --
>> Regards,
>> Peng
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]