标签: perl

<>生成的数组大小?

如果我想查找生成的数组的大小<>,为什么以下不起作用?

print "Number of .DOC and .PDF files is: " scalar(<*.PDF *.DOC>);
Run Code Online (Sandbox Code Playgroud)

它提供了第一个匹配文件的名称.

arrays size perl glob

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

Shell变量在双引号Perl单行中可见

我理解shell变量是当前shell的本地变量,而环境变量(exported 变量)传递给shell分叉的子进程.

当我在双引号内运行Perl单行程序时,我可以从forked perl进程访问(本地)shell变量:

$ FOO=bar
$ perl -we "print qx'echo $FOO'"
bar
Run Code Online (Sandbox Code Playgroud)

这是为什么?

shell perl

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

有没有可能的方法匹配第n个字符?

我的输入数据如下.我想把这个词分组在第6和第7位之间-.

my $sa = "a1a1a1-b1b1b1-c-ddd-eee-fff-gggggg-hHhH-iiii-j-KKKKK";
Run Code Online (Sandbox Code Playgroud)

为此,实际的正则表达式是

/[^-]+-[^-]+-[^-]+-[^-]+-[^-]+-([^-]+)-/
Run Code Online (Sandbox Code Playgroud)

为了构建正则表达式,我尝试如下,

my $avc = "[^-]+-" x 5 . "([^-]+)-";

my $ar = qr"$avc";

$sa =~m/$ar/g;

print $1;
Run Code Online (Sandbox Code Playgroud)

我怀疑,正则表达式中是否有任何选项可用.不使用x.我怎么能在一个正则表达式中做到这一点?

regex perl

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

使用Getopt :: Long将值分配给同一个变量

我试着写一个小的perl脚本来理解Getopt::Long.

以下是脚本:

#!/usr/bin/perl

use strict;
use Getopt::Long;

my $op_type = "";
my @q_users;

GetOptions (
  'query' => $op_type = "query",
  'create' => $op_type = "create",
  'modify' => $op_type = "modify",
  'delete' => $op_type = "delete",
  'user=s' => \@q_users
) or usage ("Invalid options.");

print "operation : $op_type\n";
Run Code Online (Sandbox Code Playgroud)

当我运行此脚本时,如下所示:

$ ./all_opt.pl --query
operation : delete
Run Code Online (Sandbox Code Playgroud)

我假设在我的程序中缺少某种破坏声明.我期待operation : query结果.

请让我知道我在这里缺少什么.

perl getopt-long

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

在Perl中切换与给定与for-when与if-elsif-else

在我写的最后一个脚本中,我需要一个类似于switch语句行为的行为.在Perl中简单搜索一个等价物导致我use Switch.一开始,一切都很好并且正常工作,直到所有内容都崩溃了并且描述性错误(它发生在具有正则表达式的情况的switch语句中,但奇怪的是它并没有发生在其他类似的switch语句中).

编辑:崩溃的代码看起来像这样:

switch ($var) {
    case /pattern1/ {...}
    case /pattern2/ {...}
    ...
    else {...}
}
Run Code Online (Sandbox Code Playgroud)

这导致我放弃使用Switch.pm和寻找替代方案.

我发现,givenfor-when,当然总是有简单的,有点幼稚if-elsif-else.

  1. 为什么Switch.pm这么不稳定?
  2. 这似乎givenfor-when具有类似的结构,但我想有区别(因为两者存在).它是什么?
  3. 是否if-elsif-else明显慢于其他选项?

perl if-statement switch-statement

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

在Perl中打印哈希对

请问这两个哈希初始化方法有什么区别?

第一种方法:

$items{"food"} = "4.4";
$items{"water"} = "5.0";
$items{"shelter"} = "1.1";

foreach $item (keys $items) {
    print "$item\n";
}
Run Code Online (Sandbox Code Playgroud)

输出是:

food
water
shelter
Run Code Online (Sandbox Code Playgroud)

第二种方法:

%items = { 
    'food' => '4.4', 
    'water' => '5.0', 
    'shelter' => '1.1' 
};

foreach $item (keys %items) {
    print "$item\n";
}
Run Code Online (Sandbox Code Playgroud)

输出是哈希引用:

HASH(0x8cc41bc)
Run Code Online (Sandbox Code Playgroud)

为什么第二种方法返回引用而不是实际值?

perl hashtable

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

为什么Perl中的system()结果不是我脚本的确切退出代码?

我有以下perl脚本(test.pl):

my $exit_code = system('./test.py');
print $exit_code."\n";
Run Code Online (Sandbox Code Playgroud)

那是试图从python可执行文件中捕获退出代码(test.py):

#!/bin/env python
import sys
sys.exit(2)
Run Code Online (Sandbox Code Playgroud)

直接运行python可执行文件返回2,这是我的预期:

> ./test.py
> echo $?
2
Run Code Online (Sandbox Code Playgroud)

但是,运行perl会返回不同的内容:

> perl test.pl
512
Run Code Online (Sandbox Code Playgroud)

为什么perl从python中捕获不同的退出代码?

perl

3
推荐指数
2
解决办法
194
查看次数

如何在perl调试器的<action中运行`x`命令?

我想在调试器中显示提示之前输出一个semicomplex结构.显示它的最佳方法是使用该x命令,但该命令在该名称下不可用,或者可能不在范围内.

我怎么做到这一点?

debugging perl

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

如何将perl哈希字符串引用转换为perl哈希引用

 HASH(0x991f0dc)
Run Code Online (Sandbox Code Playgroud)

所以上面的哈希引用在标量变量中存储为字符串,如果我们在Perl程序中用"%"取消引用它会引发错误,

Can't use string ("HASH(0x991f0dc) ") as a HASH ref while "strict refs" in use at tcpclient1.pl line 49, <GEN0> line 1

以上是从Perl程序抛出的,我请求解决方案,将哈希字符串引用转换回Perl哈希引用.

sockets perl hash reference dereference

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

使用-n或-p选项时是否可以将命令行参数传递给@ARGV?

我认为我的问题的标题基本上涵盖了它.这是一个人为的例子,试图过滤与参数化字符串完全相等的输入行,基本上是Perlish fgrep -x:

perl -ne 'chomp; print if $_ eq $ARGV[0];' bb <<<$'aa\nbb\ncc';
## Can't open bb: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

问题当然是该-n选项会while (<>) { ... }在代码周围创建一个隐式循环,而菱形运算符会占用文件名的所有命令行参数.所以,虽然在技术上的bb说法得到@ARGV,因为该参数是在整个计划失败由钻石操作回升.最终结果是,在使用时不可能将命令行参数传递给Perl程序-n.

我想我真正想要的是一个可以while (<STDIN>) { ... }在代码周围创建隐式循环的选项,因此不会对文件名采用命令行参数,但这样的事情不存在.

我可以想到三种可能的解决方法:

1: BEGIN { ... }阻止复制和清除@ARGV.

perl -ne 'BEGIN { our @x = shift(@ARGV); } chomp; print if $_ eq $x[0];' bb <<<$'aa\nbb\ncc';
## bb
Run Code Online (Sandbox Code Playgroud)

2:手动编码单行中的while循环.

perl …
Run Code Online (Sandbox Code Playgroud)

perl command-line-interface command-line-arguments

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