小编ND *_*eek的帖子

是否可以有条件地将选项传递给perl中的方法?

关于Ruby的这个问题类似,我想有条件地将参数传递给方法.目前,我将其配置如下:

my $recs = $harvester->listAllRecords(
    metadataPrefix => 'marc21',
    metadataHandler => 'MARC::File::SAX',
    set => 'pd',
    from => $from,
    until => $until,
);
Run Code Online (Sandbox Code Playgroud)

我想要的是能够有条件地传递from和/或until参数,具体取决于之前的代码.这在语法上不正确,但是像这样:

from => $from if ($from),
until => $until if ($until),
Run Code Online (Sandbox Code Playgroud)

或这个:

if ($from) {from => $from,}
if ($until) {until => $until,}
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果可以的话,我该怎么做呢?

methods perl

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

为什么我的perl哈希不返回值?

我正在提取CSV文件:

"ID","LASTNAME","FIRSTNAME","PERM_ADDR1","PERM_ADDR2","PERM_CITY","PERM_ST","PERM_ZIP","DOB","LIB_TYPE","BARCODE","EMAIL","LOCAL_ADDR1","LOCAL_ADDR2","LOCAL_CITY","LOCAL_ST","LOCAL_ZIP","CAMPUS_ADDR1","CAMPUS_ADDR2","CAMPUS_CITY","CAMPUS_ST","CAMPUS_ZIP","DEPARTMENT","MAJOR"
"123","Lastname","Firstname","123 Home St","","Home City","HS","12345-6789","0101","S","1234567890","last.first@domain.local","123 Local St","","Local City","LS","98765-4321","123 Campus St","","Campus City","CS","54321-6789","IT",""
Run Code Online (Sandbox Code Playgroud)

使用Text::CSV,我试图将其解析为哈希:

my $csv = Text::CSV->new();

chomp(my $line = <READ>);
$csv->column_names(split(/,/, $line));

until (eof(READ)) {
    $line = $csv->getline_hr(*READ);
    my %linein = %$line;
    my %patron;

    $patron{'patronid'} = $linein{'ID'};
    $patron{'last'} = $linein{'LASTNAME'};
    $patron{'first'} = $linein{'FIRSTNAME'};

    print p(%linein)."\n";
    print p(%patron)."\n";
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,最后的print语句(使用Data::Printer)返回:

{
    "BARCODE"        1234567890,
    "CAMPUS_ADDR1"   "123 Campus St",
    "CAMPUS_ADDR2"   "",
    "CAMPUS_CITY"    "Campus City",
    "CAMPUS_ST"      "CS",
    "CAMPUS_ZIP"     "54321-6789",
    "DEPARTMENT"     "IT",
    "DOB"            0101,
    "EMAIL"          "last.first@domain.local",
    "FIRSTNAME"      "Firstname",
    "ID"             123, …
Run Code Online (Sandbox Code Playgroud)

perl hash

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

是否可以在Perl中增加标量引用?

假设我有一个数字,$x = 0;我想用子程序递增它,但子程序不会返回它的值:

sub increment {
    my ($var) = @_;

    my @list = (
        'a',
        'b',
        'c',

        ...

        'x',
        'y',
        'z'
    );

    return $list[$var++];
}

while ($x < 10) {
    print increment($x);
}
Run Code Online (Sandbox Code Playgroud)

原样,这将aaaaaaaaaa永远打印而不是abcdefghij.如果我替换increment($x)increment(\$x),它会将标量地址转换为十进制数,然后将其递增.在上面的场景中,它最终会抛出一个错误,因为25423331或其他任何不是有效的数组元素.

如果$ x是散列或数组中的元素,我可以传递父作为引用以使原始修改:

$x = {'val' => 0};
while ($x->{'val'} < 10) {
    print increment($x);
}

sub increment {
    ...
    return $list[$var->{$val}++];
}
Run Code Online (Sandbox Code Playgroud)

如何修改标量参考的原始值?

perl pass-by-reference

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

使用Text :: CSV写入输出是否有附加价值?

如果我将表格输出作为CSV写入文件,那么加载额外模块Text::CSV 并将我的数据转换为对象有什么好处 让我通过基本循环和字符串操作?我已经看到了一些建议这样做的答案:如何在Perl中使用DBI获取列名和行数据以及如何使用Perl创建CSV文件.

加载一个完整的模块对于我可以在四行Perl中编写的东西(忽略数据检索等)来说似乎有点过分和巨大的开销:

my $rptText = join(',', map { qq/"$_"/ } @head) . "\n";

foreach my $person ( @$data ) {
    $rptText .= join(',', map { qq/"$person->{$_}"/ } @head) . "\n";
}
Run Code Online (Sandbox Code Playgroud)

那么什么加载 Text::CSV 让我通过上面的代码?

csv perl

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

标签 统计

perl ×4

csv ×1

hash ×1

methods ×1

pass-by-reference ×1