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

标签 perl reference character-arrays slice

这是我的问题:我有 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 更容易,或多或少具有相同的好处!

关于perl - 在 Perl 中使用引用指向滑动窗口数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14353341/

相关文章:

objective-c - 值得学习的编写良好的开源 Cocoa 应用程序?

c++ - 我可以使用 const 引用而不是 getter 函数吗?

c - 将 3D 数组传递给函数。

java - 我的 findCombos 方法不起作用,如何从 java 字符数组中删除字符

Perl Getopt::长相关问题 - 互斥的命令行参数

perl - 如何在 Perl 对象中存储文件句柄以及如何访问结果?

angular - Firestore 引用

c++ - 在 C/++ 中的函数之间传递具有动态大小的二维数组

regex - 如何制作一个perl单线 “line-endings agnostic”

Perl 构建、单元测试、代码覆盖率 : A complete working example