在 Perl 中使用引用指向滑动窗口数组

2024-04-19

这是我的问题:我有 2 个数组。一种是字符数组,代表滑动窗口。角色从开头移动并推到结尾。我想使用第二个数组来存储对数组切片的引用,这些数组切片“跟随”字符移动。例子:

my @char_array = ('h','e','l','l','o','w','o','r','l','d');
my $char_arr_ref=[@char_array[1..$#char_array]]; 
print @$char_arr_ref, "\n"; # slice contains 'elloworld';
shift(@char_array);
push(@char_array), 'x';
print @$char_arr_ref, "\n"; # slice still contains 'elloworld', not 'lloworldx' as I need;

换句话说,我希望能够使用第二个数组来引用数组切片(例如,就像我对 C 中的指针数组所做的那样)。

在 Perl 中是否有一种惯用的方法可以做到这一点?

更新:这是一个更大的程序的一部分,用于快速文本搜索。我打算使用引用的散列(例如,而不是慢得要命的“索引”函数。我需要在 Perl 中执行此操作。


在 C 中,您的窗口可能是使用指针算术来实现的。

const char* s = str+1;
const char* e = str+len;
for (const char* p=s; p!=e; ++p) putc(*p);

除了指针算术不允许您调整缓冲区的大小(push @char_array, 'x';)。即使在 C 语言中,您也必须使用偏移量。

size_t si = 1;
size_t ei = len;
for (size_t i=si; i!=e1; ++i) putc(str[i]);

这是幸运的,因为 Perl 没有指针,更不用说指针运算了。但抵消呢?没问题!

my @char_array = split //, 'helloworld';
my ($s, $e) = (1, $#char_array);
say @char_array[$s..$e];    # elloworld
shift @char_array;
push @char_array, 'x';
say @char_array[$s..$e];    # lloworldx

如果我们实际上讨论的是字符,那么字符串会更有效。

my $char_array = 'helloworld';
my ($s, $e) = (1, length($char_array));
say substr($char_array, $s, $e-$s+1);    # elloworld
$char_array =~ s/^.//s;
$char_array .= 'x';
say substr($char_array, $s, $e-$s+1);    # lloworldx

事实上,如果我们实际上谈论的是字符,我们非常幸运,因为我们可以使用左值 substr 并让 Perl 为我们处理偏移量!

my $char_array = 'helloworld';
my $substr_ref = \substr($char_array, 1, length($char_array)-1);
say $$substr_ref;        # elloworld
$char_array =~ s/^.//s;
$char_array .= 'x';
say $$substr_ref;        # lloworldx

比 C 更容易,并且具有或多或少相同的好处!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl 中使用引用指向滑动窗口数组 的相关文章

  • 如何修复 Math::BigInt 调用的 Math::Pari 中的“`as_number' 不是 Pari 函数名称”?

    在 Perl 5 8 5 上 我看到问题中列出的错误 我正在运行这些版本模块 数学 BigInt 1 89 数学 BigInt FastCalc 0 19 数学 BigInt GMP 1 24 数学 BigInt Pari 1 13 数学
  • 如何在 Perl 中修改 Windows NTFS 权限?

    我在 Windows Server 2003 上使用 ActiveState Perl 我想在 Windows NTFS 分区上创建一个目录 然后授予 Windows NT 安全组对该文件夹的读取访问权限 这在 Perl 中可能吗 我必须使
  • 我可以在 Perl 中访问动态指定类中的静态方法吗?

    是否可以在 Perl 中动态指定一个类并访问该类中的静态方法 这不起作用 但说明了我想做的事情 use Test Class1 my class Test Class1 class static method 我知道我可以这样做 class
  • 从函数返回哈希值的最佳 Perl 实践是什么?

    我正在考虑将哈希引用传递给函数或从函数返回数据的最佳实践 一方面 仅将输入值传递给函数并仅返回输出变量似乎很直观 然而 在 Perl 中传递哈希值只能通过引用来完成 因此有点混乱 而且似乎更有可能犯错误 另一种方法是在输入变量中传递引用 但
  • PHP 指针与引用

    在 PHP 中 使用指针有什么区别 例如 function foo var var 3 a 0 foo a 以及参考 function foo var var 3 a 0 foo a 它们都修改了原始变量的值 但是它们内部的表示方式不同吗
  • 在 Perl 中检测全局破坏

    我想检测我的物体是否被DESTROY作为全局破坏的一部分 并打印出警告 因为这显然是一个错误并导致数据丢失 显而易见的方法似乎是 sub DESTROY my self shift if i am in global destruction
  • 为什么 getElementsByTagName 会出现“无效谓词”错误?

    我有以下 XML
  • 如何检测FTP文件传输完成?

    我正在编写一个脚本 用于轮询 FTP 站点上的文件并在可用时将它们下载到本地 文件由各个来源方随机存放到 FTP 站点 我需要一种方法能够在下载之前检测 FTP 站点上的文件是否已被源方完全传输 关于如何解决这个问题有什么想法吗 如果您可以
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 如何匹配与 Perl 中的特定模式不匹配的字符串?

    我知道使用正则表达式很容易匹配除给定字符之外的任何内容 text ab ac ad text s c g Match anything except c text is now c 我不知道如何 排除 字符串而不是字符 我如何 匹配除 ac
  • 如何通过 sudo (或作为另一个用户)打开 Perl 文件句柄写入数据

    我想将数据写入文件 但应使用特定用户的访问权限打开文件句柄 因此 有以下声明 open FH gt filename or die n 将允许以该特定用户的身份写入文件 有没有办法在 Perl 脚本中执行此操作 而无需运行整个脚本sudo
  • 打印 Perl 数组的简单方法? (有一点格式化)

    有没有一个easy如何打印每个元素之间用逗号分隔的 Perl 数组 编写一个 for 循环来做到这一点非常简单 但不太优雅 如果这是有道理的 只需使用join http perldoc perl org functions join htm
  • 如何匹配单引号字符串中的双反斜杠?

    我需要区分带有单反斜杠和双反斜杠的字符串 Perl 对它们一视同仁 print n qqq www eee rrr print n qqq www eee rrr 将给出相同的结果 qqq www eee rrr qqq www eee r
  • 通过 TFS 构建服务执行时 MSBuild 找不到引用

    我有一个参考 Telerik 程序集的解决方案 引用的版本已安装在构建服务器上 问题是 持续集成构建总是成功的 直到我升级解决方案和构建服务器上的 Telerik 程序集 现在构建无法提供经典的 无法解析此引用 我检查了我的解决方案 一切都
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以
  • 如何在 Perl 中发送此 SOAP XML?

    我必须发送下面的 XML 我有no idea从哪儿开始 我知道我需要在 Perl 中查找 SOAP 但大致就是这样
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print

随机推荐