小编Jim*_*vis的帖子

Perl增量运算符

$a = 10; 
$b = (++$a) + (++$a) + (++$a);
print $b;
Run Code Online (Sandbox Code Playgroud)

我得到答案37.任何人都可以解释这个操作是如何进行的以及结果如何得到37.

根据我的逻辑,它应该是36:

(++$a) + (++$a) + (++$a)
   11  +    12  +    13  = 36
Run Code Online (Sandbox Code Playgroud)

但我得到答案37

perl

10
推荐指数
3
解决办法
3342
查看次数

在Perl的空白处拆分

我有一个类型的数据 -

500 3.6673656 
----------
1000 3.2707536
----------
1500 3.2356145
----------
2000 3.0495141
----------
2500 3.016674
Run Code Online (Sandbox Code Playgroud)

即时间和距离.我需要将时间分成一个数组,将距离分成另一个数组.通过使用my @line = split( /\s+/, $_);我可以将距离存储在一个数组中,但不能存储时间.有没有其他方法可以将它们分别存储在不同的数组中?

输入来自文件,内容存储在@array.

我的剧本:

    foreach $_ (@array){ 
    if($_ =~ /[@]/) {# do nothing, it's a comment or formatting line} 
    else  {my @line = split( /\s+/, $_);
    print "@line\n";}
}
Run Code Online (Sandbox Code Playgroud)

perl

4
推荐指数
2
解决办法
916
查看次数

我的eval是错误的还是我不理解Perl中的eq vs ==

我无法理解的eval也许我不明白eqVS ==.我有这个简短的Perl脚本:

[red@tools-dev1 ~]$ cat so.pl
#!/usr/local/bin/perl -w
use strict;

while(<DATA>) {
    chomp;
    my ($arg1, $arg2, $op ) = split /,/;
    if ( $op eq '=' ) {
        $op = 'eq';
    }
    my $cmd = "$arg1 $op $arg2";
    print "[$cmd]\n";
    my $rc = eval $cmd || 0;
    print "rc is [$rc]\n";
}

__DATA__
cat,cat,=
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我得到:

[red@tools-dev1 ~]$ ./so.pl
[cat eq cat]
rc is [0]
Run Code Online (Sandbox Code Playgroud)

有人会认为你会......

[cat eq cat]
rc is [1]
Run Code Online (Sandbox Code Playgroud)

...因为"猫"等于"猫",对吧?

perl

4
推荐指数
2
解决办法
202
查看次数

破折号导致DBI中的SQL麻烦

我有一个带有WHERE子句的SQL查询,该子句通常包含一个值,包括以数据库形式存储在CHAR(10)中的破折号.当我明确地调用它时,如下所示:

$sth = $dbh->prepare("SELECT STATUS_CODE FROM MyTable WHERE ACC_TYPE = 'A-50C'");

它工作正常,返回我的第一行; 但是,如果我执行以下操作:

my $code = 'A-50C';
$sth = $dbh->prepare("SELECT STATUS_CODE FROM MyTable WHERE ACC_TYPE = ?");
$sth->execute($code);
Run Code Online (Sandbox Code Playgroud)

或者我这样做:

my $code = 'A-50C';
$sth = $dbh->prepare("SELECT STATUS_CODE FROM MyTable WHERE ACC_TYPE = ?");
$sth->bind_param(1, $code);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

查询完成,但我没有得到任何结果.我怀疑它与错误解释的破折号有关,但我无法将其链接到Perl问题,因为我使用print打印了我的$ code变量,"My Content: $code\n";所以我可以确认它没有被奇怪地转换.我也尝试为b​​ind_param包含第三个值,如果我指定类似ORA_VARCHAR2,SQL_VARCHAR(尝试了所有可能性),我仍然没有得到任何结果.如果我将它更改为长格式,即{TYPE => SQL_VARCHAR},它会给我一个错误

DBI :: st = HASH <0x232a210> - > bind_param(...):属性参数'SQL_VARCHAR'不是哈希引用

最后,我尝试了不同方式的单引号和双引号以及后退标记以逃避值,但没有任何东西让我获得1行,只有0.任何想法?在文档或搜索中没有找到任何内容.这是oracle供参考.

带错误检查的代码:

my $dbh = DBI->connect($dsn, $user, $pw, {PrintError => 0, RaiseError => 0})
  or die "$DBI::errstr\n"; …
Run Code Online (Sandbox Code Playgroud)

oracle perl dbi

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

如何在 Perl 中将列表元素复制到哈希键?

我找到了几种将列表元素复制到哈希键的方法,但是有人可以解释一下这是如何工作的吗?

#!/usr/bin/perl
use v5.34.0;

my @arry = qw( ray bill lois shirly missy hank );

my %hash;
$hash{$_}++ for @arry;  # What is happening here?

foreach (keys %hash) {
  say "$_ => " . $hash{$_};
}
Run Code Online (Sandbox Code Playgroud)

输出是我所期望的。我不知道任务是如何进行的。

hank => 1
shirly => 1
missy => 1
bill => 1
lois => 1
ray => 1
Run Code Online (Sandbox Code Playgroud)

arrays perl hash list

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

$ twig-> purge给出空文件

我可能会问一个基本问题,但这会让我感到害怕.

以下是我的代码段

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;


my $twig = new XML::Twig( twig_handlers => { TRADE => \&TRADE } );

$twig->parsefile('1510.xml');

$twig->set_pretty_print('indented');

$twig->print_to_file('out.xml');

sub TRADE {
    my ( $twig, $TRADE ) = @_;
    #added delete in place of cut
     $TRADE->cut($TRADE) unless
     $TRADE->att('origin') eq "COMPUTER";
}
Run Code Online (Sandbox Code Playgroud)

这是按预期工作的.它给了我所有的"原产地"等于"计算机"的交易.

但我需要处理跨越1 GB的XML文件.在这种情况下,它会"分割错误",因为它消耗了大量内存.

因此,为了解决这个问题,我试图实现XML :: Twig的"清除"概念

因此我将代码修改为:

#!/usr/bin/perl

    use strict;
    use warnings;
    use XML::Twig;


    my $twig = new XML::Twig( twig_handlers => { TRADE => \&TRADE } );

    $twig->parsefile('1510.xml');

    $twig->set_pretty_print('indented');

    $twig->print_to_file('out.xml');

    sub TRADE { …
Run Code Online (Sandbox Code Playgroud)

perl xml-twig

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

在perl中的多个子例程调用中保留变量的值

只想知道在对同一子程序的多次调用中保留变量值的最佳方法是什么.即

$someList  = &someRoutine(100, 200);
$someList2 = &someRoutine(100, 200);

sub someRoutine {
    $someAddition = 0;
    foreach $someSum (@_){
        $someAddition += $someSum;
    }
    return $someAddition
}

print $someList;
print $someList2;
Run Code Online (Sandbox Code Playgroud)

基本上,someList应该打印300,someList2应该打印600.如何使someList2打印600?我希望在多个子程序调用中保留$ someAddition.

perl

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

单一责任原则:运行查询后将数据写入文件

我必须将运行sql查询后生成的行写入文件.

# Run the SQL script.
my $dbh = get_dbh($source);
my $qry = $dbh->prepare("$sql_data");
$qry->execute();

# Dump the data to file.
open(my $fh_write, ">", "$filename");
while (my @data = $qry->fetchrow_array())
{
  print {$fh_write} join("\t", @data) . "\n";
}
close($fh_write);
Run Code Online (Sandbox Code Playgroud)

显然,我在一个函数中做了两件事:

  1. 运行sql查询.
  2. 将数据写入文件.

有没有办法使用SRP来做到这一点?

数据中有很多行,因此从单独的函数返回行数组可能不太好.

perl single-responsibility-principle

2
推荐指数
1
解决办法
51
查看次数

File::Find 搜索目录和子目录,使用模式匹配将成功匹配存储到数组

  1. 我要匹配的模式是 *_name.txt

  2. 我要搜索的目录是 $dir($dir 有很多子目录,这就是为什么我需要File::Find而不是glob

  3. 我不会使用Find::Find::Rule(我知道它有简单的代码,但是当我运行时,它有不存在的文件错误。我不想向我的 perl 库添加其他文件)

我到目前为止的语法是

use File::Find;
find(\&store_foundfiles,$dir);
sub store_foundfiles {
  my @string = *_name.txt;
  #I DONT KNOW FROM HERE ON"
  #I WANT TO IMPLEMENT THE FOLLOWING...
  #FOREACH MATCH ON @string, STORE THE MATCH TO ARRAY '@found'
}
Run Code Online (Sandbox Code Playgroud)

perl

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

如何使用postgres dbd占位符作为DB对象名称

(或如何使用perl DBI(DBD :: PG)和占位符迭代通过信息模式?)

Windows 7,ActiveState Perl 5.20.2,PostgreSQL 9.4.1.

使用占位符表示COLUMN VALUE时,下面的案例A,B和C成功.为了

  • 没有使用占位符

  • 通过文字

  • 传递一个变量(填充相同的文字)

将它提升到数据库对象的水平会很棒..(表格,视图等)

这是案例D的错误输出:

Z:\CTAM\data_threat_mapping\DB Stats\perl scripts>test_placeholder.pl

A Row Count: 1
B Row Count: 1
C Row Count: 1

DBD::Pg::st execute failed: ERROR:  syntax error at or near "$1"

LINE 1: SELECT COUNT(*) FROM $1 WHERE status = 'Draft';
                             ^ at Z:\CTAM\data_threat_mapping\DB     Stats\perl 
scripts\test_placeholder.pl line 34.
Run Code Online (Sandbox Code Playgroud)

任何方向都有很大的帮助!

#!/usr/bin/perl -w
use strict;
use diagnostics;
use DBI;

my $num_rows = 0;

# connect
my $dbh = DBI->connect("DBI:Pg:dbname=CTAM;host=localhost",
                       "postgres", "xxxxx",
                       { …
Run Code Online (Sandbox Code Playgroud)

postgresql perl

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