循环中同时实现序列(列表)的左移右移、嵌套变量(间接变量)替换

最近需要编写一个脚本来处理数据,编写过程中遇到了两个难题:

(1)有一个列表[ X Y Z]和一组变量 A_0, A_1, A_2。我要实现一个循环如下:

                在第一次循环中,输出 X Y Z和A_0 A_1 A_2;

                在第二次循环中,输出 Y Z X和A_2 A_0 A_1;

                在第二次循环中,输出 Z X Y和A_1 A_2 A_0;

也就是在每一个循环中同时分别实现列表[ X Y Z ]和 [ A_0, A_1, A_2 ]的左移和右移

(2)嵌套变量替换问题

经过一段时间的网上各种资料的查找加上自己的经验最终解决了以上问题,在此总结如下,希望和广大热心网友和各位大佬一起探讨,更期待各位大佬的批评指正。

首先,实现列表左移

通过以上脚本容易得到列表左移,输出结果如下:

而列表右移则加入如下代码(红色方框为新加代码):

运行后输出结果如下(三个红色方框分别为三次循环输出):

可以看到代码实现了我想要的结果,然而个人感觉实现列表右移的代码太过复杂,凭直觉应该有更简单优雅的代码,期待各位网友能够给出。

在实现列表右移的过程中遇到了嵌套变量替换的问题,就顺便解决了一下这个问题。

用${B_$A}替换变量会导致错误,此处原因我还没搞懂,希望网友给出

使用eval赋值语句之后可以看到,嵌套变量替换成功。原因:eval会把赋值语句中双引号之间的内容直接赋给‘=’前的变量,而不是当作字符串赋给变量,当在一个赋值语句的前面加上 eval 时,它就会将 后面表达式中以 $ 开头的所有变量进行整体替换。此处执行过程为将$A替换为A的值1,从而test就变成了$B_1,加上前面解释的eval的作用,$B_1会被替换为B_1的值3,因此,test的最终值就是3。

关于eval实现嵌套变量的方法参考shell中eval命令妙用——变量嵌套替换 - AhaoMu - 博客园

继续测试发现,如方框1所示,将$符号和变量的几个字符连续写到一个双引号中并不能替换变量得到B_1的值而只输出了A的值;而将$符号单独写到一个双引号中(如方框2所示),再将变量的几个字符连续写到一个双引号中能够得到正确结果

继续测试,这样s相当于${B_1},${B_1}的效果比$B_1的效果更好,因为前者可以明确体现出变量的开始和结束界限,然后再进行变量替换得到了同样的结果。

以上就是最近的一点经验总结,分享出来和大家一起探讨,希望得到大家的批评指正,上文中提到的两个问题(其一是列表右移的更优雅代码,其二就是${B_$A}变量替换导致错误的原因)也期待万能网友予以解决,如果能给出一定的参考书籍就更nice了。

====================更新一下===========================

最近看到了bash的中文文档手册,里面有关于引用间接变量(也就是这里的嵌套变量)的解释,看下图就能轻松搞明白。命令\$$b先引用b的值a,然后引用a的 值1。

bash中文手册链接:https://chegva.com/ueditor/php/upload/file/20180103/1514968607814189.pdf。间接变量在 Sell扩展-shell参数扩展一节(p16)

除此之外,间接变量还可如下引用,看图就懂~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 JavaScript 的 DOM 操作来实现表格数据的左移右移功能。具体实现步骤如下: 1. 获取表格元素及其子元素,使用 document.getElementById() 或 document.querySelector() 方法获取表格元素,使用表格元素的 rows 属性获取所有行元素。 2. 定义左移右移函数,通过修改表格行元素的 innerHTML 属性来实现数据的左移右移。例如,左移函数可以将每一行的第一个单元格移动到该行的最后一个单元格,右移函数可以将每一行的最后一个单元格移动到该行的第一个单元格。 3. 绑定左移右移事件,使用 addEventListener() 方法为左移右移按钮绑定 click 事件,当用户点击按钮时触发相应的左移右移函数。 以下是一个简单的示例代码: ```html <table id="myTable"> <tr> <td>1</td> <td>A</td> <td>B</td> <td>C</td> </tr> <tr> <td>2</td> <td>D</td> <td>E</td> <td>F</td> </tr> </table> <button id="leftBtn">左移</button> <button id="rightBtn">右移</button> <script> const table = document.getElementById('myTable'); const rows = table.rows; function leftShift() { for (let i = 0; i < rows.length; i++) { const firstCell = rows[i].cells[0]; const lastCell = rows[i].cells[rows[i].cells.length - 1]; rows[i].insertBefore(firstCell, lastCell.nextSibling); } } function rightShift() { for (let i = 0; i < rows.length; i++) { const firstCell = rows[i].cells[0]; const lastCell = rows[i].cells[rows[i].cells.length - 1]; rows[i].insertBefore(lastCell, firstCell); } } const leftBtn = document.getElementById('leftBtn'); const rightBtn = document.getElementById('rightBtn'); leftBtn.addEventListener('click', leftShift); rightBtn.addEventListener('click', rightShift); </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值