From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY,WEIRD_QUOTING autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 16998 invoked from network); 3 Jun 2021 18:13:12 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 3 Jun 2021 18:13:12 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1622743992; b=c0TIJYjqo5xfwJ/1IQu26AhhvyVf90mVFa/1TPENEGn1CE+niRORKPy8DkjmqfQMUU+TuTpjkO 2dl0dtqhtr1Vx3wM+HhRrfbqAlYELoevL0TUsMFqhniDpCdUlDscKAhf4DUcUaFaRE1CvfdQkL rPyyRlbLh1ssvt+n1wyjL7n0AHz0GM5A9OfOAPT7/BU/9jwddTYP8MIOS0w5ZjwYBCJjH78huB 6kVetQq/MTEWl/PZ5rlkmvlI3/wD+q3uRIF1eD54WB9DbewKJakksUF0TsXuBjhlm/2Q4B/pTA Jas6Bb1IqrrMm/OAMZSMGmGkfl+XNeE1XqRBqIjtX+vmUg==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ot1-f47.google.com) smtp.remote-ip=209.85.210.47; dkim=pass header.d=brasslantern-com.20150623.gappssmtp.com header.s=20150623 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1622743992; bh=jp7qUiWErS48Dt9rPWu3jUzix6o6lQ6FD5qdXcxo93E=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:DKIM-Signature:DKIM-Signature; b=haHJiVbYfyd9n2fhA6vHXU/aDa8WXo+HD8ENXmpPouJku/I7VshcYSrir0VB3dmnIKKT742GXK 14dpC6bh99o9Cap5Wx4cda+e+xcRiyGZsMAbYtC880/kP9oDFTl2DrijOdyplJ8N0ITwuVBx1/ KM2UzcHuAL4/A8rFcKc7WUmIbvp3TNxZw70jsiBeBiORWRJvRadYF9d/A1opQLKyIrgmXjNTlp UEfGnohXtjq/KJurdkLA7VYsuWLQ//pE+z3ALI+0wYHYf8jCcdwViH19BIP5PTCMxeveHXeHLq M4rsS4yhiWSbVwo+tW9od3otTRO7+R9VM8RuyD4JftFWAw==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20200801; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:To:Subject:Message-ID: Date:From:In-Reply-To:References:MIME-Version:Reply-To:Cc: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=37HlSx/dAJHJLIzeUlVgBAvGqk/+aWHHu8vOC/CwOvc=; b=OqOR+t5nRavmvHwFMPA6yO+p6P o49xnzASOUF5P3o42aJS3i9pW3SVT8RM7GJ7IbwzAWnRISYYQ/Z5jp3SLHjsKtuVOaU546uu4wUVj 4GUZ4OKolYT01mw8gh2CepFH0zkK4P7k1KSxuQeX0a2W2EePhxfLYl79pbWp47EAj4KJ7pUfqw4RT NPKyP7VP8HXEBKw+vu1L0XSIr7Xlt6tNUwX85dmOEnyWXVR4A9T7Clqo+7VeqtHQb9/QLErrmniuE Ph3CdZEdnUxwbMuALXx/0DLTmfqs5zHMx5OW5sYUKFuBSgruDlxea4SfmNoEIZHSZvSRBJbtzxwfe uFwoum/Q==; Received: from authenticated user by zero.zsh.org with local id 1lorqA-000MMJ-I3; Thu, 03 Jun 2021 18:13:10 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ot1-f47.google.com) smtp.remote-ip=209.85.210.47; dkim=pass header.d=brasslantern-com.20150623.gappssmtp.com header.s=20150623 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none Received: from mail-ot1-f47.google.com ([209.85.210.47]:44983) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1lorpY-000M3H-Bb; Thu, 03 Jun 2021 18:12:33 +0000 Received: by mail-ot1-f47.google.com with SMTP id r26-20020a056830121ab02902a5ff1c9b81so6581726otp.11 for ; Thu, 03 Jun 2021 11:12:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=37HlSx/dAJHJLIzeUlVgBAvGqk/+aWHHu8vOC/CwOvc=; b=Mv+p8o/vPaAlXLfoHT3wXAttgCZUXSVxuedYrrz2oyWpaC6ksejSgkHCBzJlLEoK+b 2mwyQzipEml+qOlCYbaaM/oU0I5WK3lUI3D4xEfiSfB5PXSYmTaadAzq3qPaiGDJ5T8O hvU45COoehZVqlw+6Q4bKWXw7RWE8lYaInSNJoq+KqFJsQ40qTmReFriY16g92BZXoUH F4/Uy8Qnf5QWb9n0eva9eFXRHZrtF6yS5ROUp21FgllvI8CT6/xedjOHFEUQboaMwCyY rV+LwtdKEUq37gDFtYYHHjgaRGqFSB4vWpxqwt7A5GcYU2ppE1L3990t6V5RYa3QfMWR FVaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=37HlSx/dAJHJLIzeUlVgBAvGqk/+aWHHu8vOC/CwOvc=; b=B6AWNAXiGbKdzqb++1vlEWVqjkU12DfurawLm2vVOiKQXsjMgLQbFU9n2afUq0uGsV ltIXozUtzFyY18NXUegPuUpwmqJgobc+9ILCtJrmPCdm8O89/gko6RqosQm3gaoUkqyQ 02wxs42fIspOyzf+N8g4rqe8tvOOFAaUKsHcgXVSL5L3gw9Rr6veTNF6sXL+KHbs0w+H aKz8IAPceuG/Q7zcj3Gv3ySMulin4AyexxkkgpnajFtPTFwtD2KlU6VRfZ/IFoQd68Od 5Kah6AcAUJS4m2nBVaTLSbHU5qk+JKTU5RvsvVQblUgDIlk9UP/jR8jjd0mnho8M05sZ KbVA== X-Gm-Message-State: AOAM5333s4s+SK+ZQm4GJIV1zrS1BrXdEm755ftyjcRLkubU6az93RTJ pVEIfb/mfKgRSry5MORdsEyRXafe22SWzNhujRh5mA== X-Google-Smtp-Source: ABdhPJyBG9xR/dEP+UKnxiClRPTZA7dI6xp3a8tn9v8y1TjZuCaUi0WD6rJQ4VnfM+Xkrm4matccco1q0N086Z56Nqo= X-Received: by 2002:a9d:65d5:: with SMTP id z21mr457809oth.229.1622743950794; Thu, 03 Jun 2021 11:12:30 -0700 (PDT) MIME-Version: 1.0 References: <20210601053235.b4junj6muuwegl7b@chazelas.org> <20210602091145.xvyymjxdors6kqya@chazelas.org> <20210602142005.b5tw2hj2c6q3psqv@chazelas.org> <1629605749.599911.1622710481163@mail2.virginmedia.com> <20210603131347.i7bv7ao7j3hk3a2e@chazelas.org> In-Reply-To: <20210603131347.i7bv7ao7j3hk3a2e@chazelas.org> From: Bart Schaefer Date: Thu, 3 Jun 2021 11:12:19 -0700 Message-ID: Subject: Re: [PATCH (not final)] (take three?) unset "array[$anything]" To: Peter Stephenson , Zsh hackers list Content-Type: multipart/mixed; boundary="000000000000bfd7c705c3e084cf" X-Seq: 49005 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: --000000000000bfd7c705c3e084cf Content-Type: text/plain; charset="UTF-8" On Thu, Jun 3, 2021 at 6:14 AM Stephane Chazelas wrote: > > If I understand correctly, the "stripquote" variant is the one > where the user can do: > > unset 'hash["foo"]' > > unset "hash['']" > > unset "hash[${(qq)key}]" > > That is where quotes are parsed and removed but otherwise > serve no purpose. I guess you can describe it that way, yes. > That hardly helps with backward compatibility as users who did > work around the previous behaviour will still have to adapt > their work around The point of my previous analysis is that they probably will not have to adapt. Your $MATCH workaround operates correctly with the stripquote version in nearly as many cases as it currently does (it is not foolproof for the current shell implementation). However, that doesn't mean I advocate for this over the "literal" variant. > and those who didn't (who did unset > "hash[$key]") will have their code choke on even more characters > (", $, ' in addition to the previous ones, and likely more > confusing behaviour when there are unmatched quotes or ()). I extended my test set to include a number of variations on those characters as well. I've attached the test script. Here are my test cases that fail if you just blindly do for k in ${(k)ax}; do unset "ax[$k]"; done typeset -p ax with appropriate trapping for the fatal errors. The literal variant gets all of these, leaving the test hash empty. Neither literal nor stripquote throws any errors, so the trap is only needed for the current implementation. Starting with that: typeset -A ax=( [$'\M-\C-@\\']=$'\M-\C-@\\' [$'\M-\C-@`']=$'\M-\C-@`' ['"${(@w)oops"']='"${(@w)oops"' ['(a']='(a' ['\$']='\$' ['\(']='\(' ['\)']='\)' ['\[']='\[' ['\\\']='\\\' ['\\\\']='\\\\' ['\]']='\]' ['\`']='\`' ) The cases that fail with the stripquote variation: typeset -A ax=( [$'\M-\C-@\\']=$'\M-\C-@\\' ['""']='""' ['"$oops"']='"$oops"' ['"safe"']='"safe"' ['"set"']='"set"' [\'\']=\'\' [\''safe'\']=\''safe'\' [\''set'\']=\''set'\' ['\!']='\!' ['\$']='\$' ['\(']='\(' ['\)']='\)' ['\*']='\*' ['\=']='\=' ['\@']='\@' ['\[']='\[' ['\\\']='\\\' ['\\\\']='\\\\' ['\]']='\]' ['\`']='\`' ['\s\a\f\e']='\s\a\f\e' ['\s\e\t']='\s\e\t' ) Current shell using $MATCH workaround: typeset -A ax=( [$'\M-\C-@`']=$'\M-\C-@`' ['"${(@w)oops"']='"${(@w)oops"' ['(']='(' ['(a']='(a' [')']=')' ['[']='[' ['\(']='\(' ['\)']='\)' ['\[']='\[' ['\`']='\`' ['`']='`' ) And stripquote with $MATCH workaround: typeset -A ax=( ['""']='""' ['"$oops"']='"$oops"' ['"safe"']='"safe"' ['"set"']='"set"' [\'\']=\'\' [\''safe'\']=\''safe'\' [\''set'\']=\''set'\' ['\`']='\`' ) Finally, literal with $MATCH workaround: typeset -A ax=( [$'\M-\C-@\\']=$'\M-\C-@\\' ['\']='\' ['\!']='\!' ['\$']='\$' ['\(']='\(' ['\)']='\)' ['\*']='\*' ['\=']='\=' ['\@']='\@' ['\[']='\[' ['\\\']='\\\' ['\`']='\`' ['\s\a\f\e']='\s\a\f\e' ['\s\e\t']='\s\e\t' [']']=']' ) I agree that the literal variation is probably the one most useful to re-apply in cases like read, print -v, etc. --000000000000bfd7c705c3e084cf Content-Type: application/octet-stream; name="test_unset.zsh" Content-Disposition: attachment; filename="test_unset.zsh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kph7sq3n0 ZXhlYyAyPiYxCSMgdG8gc2VlIGZhdGFsIGVycm9yIG1lc3NhZ2VzIGluIHByb3BlciBzZXF1ZW5j ZQp1bnNldCBheCBieCBvb3BzCm9vcHM9J3RoaXMgaXMgYSBwcm9ibGVtJwp0eXBlc2V0IC1BIGF4 IGJ4CnR5cGVzZXQgLWEga3g9KAogICcnICdcJyAnYCcgJygnICdbJyAnKScgJ10nICc9JyAnIicg IiciICchJyAnQCcgJyQnICcqJwogICQnXDAnICdcXCcgJ1xgJyAnXCgnICdcWycgJ1wpJyAnXF0n ICdcPScgJ1whJyAnXEAnICdcJCcgJ1wqJwogICcoKXNhZmUnICcocilzZXQnICcoUilzZXQnICco aylzYWZlJwkjIGxvb2sgbGlrZSB2YWxpZCBzdWJzY3JpcHQgZmxhZ3MKICAnKGEnICcoYSknICco bjpmb286KWEnICcobjoxKWEnCSMgbG9vayBsaWtlIGludmFsaWQgc3Vic2NyaXB0IGZsYWdzCiAg J3NldCcgJyJzZXQiJyBcJ3NldFwnICdcc1xlXHQnCiAgJ3NhZmUnICcic2FmZSInIFwnc2FmZVwn ICdcc1xhXGZcZScKICAnXFwnICdcXFwnICdcXFxcJyAnIiInIFwnXCcKICAndHdvIHdvcmRzJyAn dHdvICBzcGFjZXMnICcgaW5pdGlhbCBzcGFjZScgJ3RyYWlsaW5nIHNwYWNlICcKICAkJ1x4ODBc XCcgJCdceDgwXGAnICQnXHg4MFx+JwkJIyBicm9rZW4gVVRGLTgKICAnP34+IycKICAnJG9vcHMn ICcke29vcHN9JyAnIiRvb3BzIicgJyIkeyhAdylvb3BzIicgJyR7KHFxcSlvb3BzfScgJyQoZWNo byBvb3BzKScKKQpmb3IgKChpPTA7IGk8MjU1OyBpKyspKTsgZG8KICBwcmludGYgLXYgbiAnXFx4 JTAyeCcgJGkKICBldmFsICJreCs9KFwkJyRuJykiCmRvbmUKCmZvciBrIGluICIka3hbQF0iOyBk bwogIGF4WyRrXT0kawogIGJ4WyRrXT0kawpkb25lCnR5cGVzZXQgLXAgMSBheApwcmludCBDT1VO VDogJCNheAoKcHJpbnQgJCdcbldpdGggKGIpJwpmb3IgayBpbiAiJGt4W0BdIjsgZG8KICAoIHVu c2V0ICJheFskeyhiKWt9XSIgKSAmJiB1bnNldCAiYXhbJHsoYilrfV0iICYmCiAgcHJpbnQgLXIg LS0gJHtheFska10rTWlzc2VkfSAkeyhWKWF4WyRrXS1Hb3QgJGt9CmRvbmUKdHlwZXNldCAtcCAx IGF4CgpheD0oJHsoa3YpYnh9KQpwcmludCAkJ1xuV2l0aCAocSknCmZvciBrIGluICIka3hbQF0i OyBkbwogICggdW5zZXQgImF4WyR7KHEpa31dIiApICYmIHVuc2V0ICJheFskeyhxKWt9XSIgJiYK ICBwcmludCAtciAtLSAke2F4WyRrXStNaXNzZWR9ICR7KFYpYXhbJGtdLUdvdCAka30KZG9uZQp0 eXBlc2V0IC1wIDEgYXgKCmF4PSgkeyhrdilieH0pCnByaW50ICQnXG5XaXRoIChxcSknCmZvciBr IGluICIka3hbQF0iOyBkbwogICggdW5zZXQgImF4WyR7KHFxKWt9XSIgKSAmJiB1bnNldCAiYXhb JHsocXEpa31dIiAmJgogIHByaW50IC1yIC0tICR7YXhbJGtdK01pc3NlZH0gJHsoVilheFska10t R290ICRrfQpkb25lCnR5cGVzZXQgLXAgMSBheAoKYXg9KCR7KGt2KWJ4fSkKcHJpbnQgJCdcbldp dGggKHFxcSknCmZvciBrIGluICIka3hbQF0iOyBkbwogICggdW5zZXQgImF4WyR7KHFxcSlrfV0i ICkgJiYgdW5zZXQgImF4WyR7KHFxcSlrfV0iICYmCiAgcHJpbnQgLXIgLS0gJHtheFska10rTWlz c2VkfSAkeyhWKWF4WyRrXS1Hb3QgJGt9CmRvbmUKdHlwZXNldCAtcCAxIGF4CgpheD0oJHsoa3Yp Ynh9KQpwcmludCAkJ1xuV2l0aG91dCBiYWNrc2xhc2hlcycKZm9yIGsgaW4gIiRreFtAXSI7IGRv CiAgKCB1bnNldCAiYXhbJGtdIiApICYmIHVuc2V0ICJheFska10iICYmCiAgcHJpbnQgLXIgLS0g JHtheFska10rTWlzc2VkfSAkeyhWKWF4WyRrXS1Hb3QgJGt9CmRvbmUKdHlwZXNldCAtcCAxIGF4 CgpheD0oJHsoa3YpYnh9KQpwcmludCAkJ1xuV2l0aCBwYXR0ZXJuIGZyb20gd29ya2Vycy80MzI2 OScKZm9yIGsgaW4gIiRreFtAXSI7IGRvCiAgKCB1bnNldCAiYXhbJHsoKilrLy8oI20pW11cXF0v XFwkTUFUQ0h9XSIgKSAmJgogIHVuc2V0ICJheFskeygqKWsvLygjbSlbXVxcXS9cXCRNQVRDSH1d IiAmJgogIHByaW50IC1yIC0tICR7YXhbJGtdK01pc3NlZH0gJHsoVilheFska10tR290ICRrfQpk b25lCnR5cGVzZXQgLXAgMSBheApwcmludCBDT1VOVDogJCNheAo= --000000000000bfd7c705c3e084cf--