小编mmc*_*coo的帖子

推迟Perl中范围更改的代码

我经常发现能够在离开当前范围时安排执行代码很有用.在我以前的TCL生活中,一位朋友创建了一个名为defer的函数.

它启用了代码:set fp [open"x"] defer("close $ fp");

当前范围退出时调用的.主要的好处是无论我如何/在何处留下范围,它总是被调用.

所以我在Perl中实现了类似的东西,但似乎有一种更简单的方法.评论批评欢迎.

我在Perl中的方式:

  • 创建一个全局的绑定变量,该变量包含要执行的子数组.
  • 每当我想安排在退出时调用fn时,我使用local来更改数组.当我离开当前范围时,Perl将全局更改为先前的值,因为全局是绑定的,我知道何时发生此值更改并且可以调用列表中的subs.

实际代码如下.

有一个更好的方法吗?似乎这将是一项常用的功能.

use strict;

package tiescalar;

sub TIESCALAR {
    my $class = shift;

    my $self = {};
    bless $self, $class;
    return $self;
}

sub FETCH {
    my $self = shift;
    return $self->{VAL};
}

sub STORE {
    my $self = shift;
    my $value = shift;

    if (defined($self->{VAL}) && defined($value)) {
    foreach my $s (@{$self->{VAL}}) { &$s; }
    }
    $self->{VAL} = $value;
}

1;

package main;

our $h;
tie($h, 'tiescalar'); …
Run Code Online (Sandbox Code Playgroud)

perl scope tie

5
推荐指数
1
解决办法
479
查看次数

我可以让fcntl和Perl警报合作吗?

我在Linux上,nfs,涉及多台机器.

我正在尝试使用fcntl来实现文件锁定.我一直在使用flock,直到我发现它只能在同一台机器上的进程之间工作.

现在当我用F_SETLKW调用fcntl时,perl警报(用于添加超时)不像以前那样工作.这通常没问题,但是ctrl-c也没有用.

我相信正在发生的事情是,fcntl每隔30秒左右只检查一次信号.警报最终会回来.ctrl-c最终被抓住了.

有什么办法可以调整fcntl检查这些信号的频率吗?

perl nfs locking fcntl

5
推荐指数
1
解决办法
449
查看次数

采购csh脚本时如何获取__FILE__

我有一个脚本,用于在调用csh shell中设置一些env var。其中一些变量取决于脚本的位置。

如果该文件是正确的csh脚本,则可以使用$ 0进行访问,__FILE__但是如果使用源代码运行该脚本,它只会告诉我csh或tcsh。

由于我使用此方法在父shell中设置var,因此必须使用source。

该怎么办?

csh tcsh

5
推荐指数
1
解决办法
1614
查看次数

如何从QTextEdit或QPlainTextEdit小部件获取当前可见的文本?

看起来这是常见的事情,但我无法找到.

我有一个带有大量文本的QTextEdit或QPlainTextEdit小部件.足够滚动是必要的.

我想要另一个小部件来提供有关当前可见文本的一些信息.要做到这一点,我需要知道

  1. 当可见文本发生变化时
  2. 什么是文字?

我看到QPlainTextEdit的方法是firstVisibleBlock,但它受到保护.这告诉我,这不是我应该在我的应用程序中使用的东西.否则我不需要从编辑窗口子类化.

我也看到有信号updateRequest,但我不清楚我对QRect做了什么.

我该怎么做或在哪里找到提示?

c++ qt qtextedit

5
推荐指数
1
解决办法
3352
查看次数

如何在忽略差异时区分两个文件我已经标记为已知

我正在尝试维护相同内容的两个并行版本.偶尔,我花一些时间将它们彼此同步.

我发现这样做的一种方法是在每对文件之间进行区分并查看差异.

问题是我知道有很多不同之处.他们将继续不同.我正在寻找其他的东西.

有没有一个diff工具可以让我标记特定的差异已知/忽略?

我在使用SVN的linux环境中.我使用基于Windows的实用程序很好.

svn diff

5
推荐指数
1
解决办法
99
查看次数

在Perl中打印多行字符串而不使用变量替换的简单方法是什么?

我有一个Perl程序,它读入一堆数据,然后输出,然后输出几种不同的文件格式.我想让Perl成为这些格式之一(以.pm包的形式),并允许人们在他们自己的Perl脚本中使用munged数据.

使用Data :: Dump :: pp可以轻松打印出数据.

我还想在生成的包中打印一些辅助函数.

没有变量替换的情况下打印多行字符串的简单方法是什么?

我希望能够做到:

print <<EOL;
  sub xyz { 
    my $var = shift;
  }
EOL
Run Code Online (Sandbox Code Playgroud)

但后来我不得不逃避所有的$.

有一个简单的方法吗?也许我可以创建一个实际的子和一些神奇的漂亮打印机打印内容?打印的代码不必与输入匹配,甚至不清晰.

perl

4
推荐指数
1
解决办法
4732
查看次数

如何将ckey-left绑定到word-left?

我使用tcsh和emacs.在emacs中,我习惯于使用ctrl-left bindkey将一个单词向左移动.我想在我的tcsh终端做同样的事情.

我可以做ctrl-b,但我只是不习惯它.

我从bindkey manpath中不清楚如何指定ctrl-left键组合.

我该怎么做?

tcsh

4
推荐指数
1
解决办法
2991
查看次数

如何检查Perl编译是否已经完成?

我有一些代码要求应用程序在执行之前完全加载和编译.

有没有办法检查我的Perl程序是否仍处于编译阶段?

我有一些有用的东西,但必须有一个更好的方法:

sub check_compile {
  printf("checking\n");
  foreach my $depth (0..10) {
    my ($package, $filename, $line, $subroutine) = caller($depth);
    last unless (defined($package));

    printf("  %s %s %s %s %s\n", $depth, $package, $filename, $line, $subroutine);

    if ($subroutine =~ /::BEGIN$/) {
      printf("in compile\n");
      return 1;
    }

  }

  printf("not in compile\n");
  return 0;
}


BEGIN {
  check_compile();
}

use subpkg;

check_compile();
Run Code Online (Sandbox Code Playgroud)

和subpkg.pm包含:

package subpkg;

use strict;
use warnings;

printf("initing subpkg\n");
main::check_compile();

1; # successfully loaded
Run Code Online (Sandbox Code Playgroud)

perl

4
推荐指数
1
解决办法
156
查看次数

如何在不创建其他进程的情况下访问gzip压缩文件?

我的应用程序读取和写入大量中型到大型文件.我想以压缩格式存储这些内容.节省磁盘空间和网络时间.

一种方法是这样做:

sub fopen {
  my $mode = shift;
  my $filename = shift;

  if ($filename =~ /\.gz$/) {
    if ($mode eq "<") {
      open(my $fp, "-|", "/usr/bin/gzcat $filename");
      #my $fp = gzopen($filename, "rb") ;
      return $fp;
    }
    if ($mode eq ">") {
      open(my $fp, "|-", "/usr/bin/gzip > $filename");
      #my $fp = gzopen($filename, "wb") ;
      return $fp;
    }
  } else {
    open(my $fp, $mode, $filename);
    return $fp;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以通过将调用交换为open来更改现有代码.

从函数中可以明显看出,我还想过使用zlib/compress库.问题是结果不能作为文件指针传递.

有没有办法做到这一点,不涉及创建一堆额外的进程?

perl gzip

3
推荐指数
1
解决办法
1万
查看次数

如果他们有一定的扩展名,我怎样才能将emac chmod新文件变为可执行文件?

我经常编写小的perl脚本来解决探索perl行为的各种问题.

我使用.pl文件的模板很好.它将基础知识自动填充到我的缓冲区中.

一个小烦恼是每当我这样做,在运行之前,我必须chmod ugo + x

我能否自动获取emacs(基于文件扩展名)?

emacs

3
推荐指数
1
解决办法
781
查看次数

标签 统计

perl ×5

tcsh ×2

c++ ×1

csh ×1

diff ×1

emacs ×1

fcntl ×1

gzip ×1

locking ×1

nfs ×1

qt ×1

qtextedit ×1

scope ×1

svn ×1

tie ×1