小编Dav*_* W.的帖子

用"连接"连接Perl中的字符串

请参阅下面的更新

我正在阅读一大堆Perl脚本,我公司的某个人写过这些脚本.他曾经join用来连接字符串.例如,他这样做(从真正的Perl脚本中取出):

$fullpath=join "", $Upload_Loc, "/", "$filename";
Run Code Online (Sandbox Code Playgroud)

而不是这个:

$fullpath = "$Upload_Loc" . "/" . "$filename";
Run Code Online (Sandbox Code Playgroud)

或者就是这样:

$fullpath = "$Upload_Loc/$filename";
Run Code Online (Sandbox Code Playgroud)

他不在了,但是在这里的人告诉我他以这种方式连接字符串,因为它在某种程度上更好.(他们不太清楚为什么).

那么,为什么有人会join在这个问题上使用.连接运算符,或者只是像第三个例子那样键入字符串?这种编码风格是否有正当理由?

我想在这里清理很多乱七八糟的东西,我的第一个想法是结束这种做法.它使代码更难阅读,我确信做一个join不是一种连接字符串的非常有效的方法.然而,虽然自从3.x版以来我一直在用Perl编写脚本,但我并不认为自己是一个大师,因为我从来没有机会和Perl比Perl更好的人和我教我Perl深刻的内心秘密.在我愚弄自己之前,我只是想确保我的直觉在这里是正确的.

我有更好的办法在这里做到这一点.


更新

人们变得困惑.他不只是为了连接路径.这是另一个例子:

$hotfix=join "", "$app", "_", "$mod", "_", "$bld", "_", "$hf", ".zip";
Run Code Online (Sandbox Code Playgroud)

我会在哪里做这样的事情:

$hotfix = $app . "_"  $mod . "_" . $bld . "_" . "$hf.zip";
Run Code Online (Sandbox Code Playgroud)

或者,更有可能

$hotfix = "${app}_${mod}_${bld}_${hf}.zip";
Run Code Online (Sandbox Code Playgroud)

或者在这种情况下,我可能实际使用,join因为下划线会导致问题:

$hotfix = join("_", $app, $mod, $bld, $hf) . ".zip";
Run Code Online (Sandbox Code Playgroud)

我的问题仍然是:他是否正在做一些真正的Perl黑客知道的事情,而像我一样只做了15年的新手却不知道?人们看着我使用串联字符串.或者只是将它们放在引号中并说"哈!真是个菜鸟!我敢打赌他也拥有一台Macintosh!"

或者,以前的家伙是否只有一种 …

perl

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

Ant在jar任务中使用Fileset并重命名文件

我有以下代码:

<jar destfile="${jar.file}">
     <fileset dir="${basedir}/resources"/>
        <include name="META-INF/ejb-jar.xml"/>
        <include name="META-INF/persistence-prod.xml"/>
     </fileset>
     [...]
</jar>
Run Code Online (Sandbox Code Playgroud)

问题是persistence-prod.xm1应该persistence.xml放在罐子里.

我知道我可以创建一个工作目录并在那里布置我的整个jar,然后将其打包.我知道我可以将其中一个文件复制到其他地方并在复制时重命名.如果我有一大堆命名*-prod.xml为重命名的文件*.xml,我可以在复制任务中使用文件映射器.但是,我希望能够在<jar>任务中重命名该文件.我尝试添加<globmapper>到jar任务,但我收到了错误消息:jar doesn't support the nested "globmapper" element.

知道如何在jaring文件时重命名吗?

ant jar

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

Scalar :: Util与ref函数

内置ref($object)和有Scalar::Util blessed($object)什么区别?一个比另一个更受欢迎吗?

use strict;
use warnings;

use Scalar::Util qw(blessed isvstring);

my $object = foo->new();

print "Object is a " . blessed($object) . "\n";
print "Object is a " . ref($object) . "\n";

my $version = 5.00.03;

print "Version is a " . ref(\$version) . "\n";
if (isvstring($version)) {
    print "Version is a VSTRING\n";
}

package foo;
sub new {
    my $class = shift;
    my $self = {};

    bless($self, $class);
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

perl perl-module

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

Ant:如何在所有子文件夹中进行交互并在ant中执行任务

目前我这样做

<foreach list="${myfolders}" target="bundle"
     param="worksheet" inheritall="true"/>
Run Code Online (Sandbox Code Playgroud)

在文件夹列表上执行目标"bundle".但问题是我需要设置此列表.如何使用Ant来遍历给定父目录的所有文件夹?

如果有办法做到这一点,也排除了更好的特定文件夹.谢谢.

ant loops

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

Perl子程序原型 - 正确的方法

我有一个名为debug我在我的代码中使用的子程序.它基本上可以让我看到发生了什么,等等.

sub debug {
    my $message      = shift;
    my $messageLevel = shift;

    our $debugLevel;
    $messageLevel = 1 if not defined $messageLevel;
    return if $messageLevel > $debugLevel;
    my $printMessage = "    " x $messageLevel . "DEBUG: $message\n";
    print STDERR $printMessage;
    return $printMessage;
}
Run Code Online (Sandbox Code Playgroud)

我想要原型,所以我可以做这样的事情:

debug "Here I am! And the value of foo is $foo";
Run Code Online (Sandbox Code Playgroud)

要么

debug "I am in subroutine foo", 3;
Run Code Online (Sandbox Code Playgroud)

同时,我喜欢将子程序定义放在我的程序的底部,所以你不必在代码中用1/2来找到程序的内容.

我想这样做:

sub debug($;$);  #Prototype debug subroutine

/Here goes the main program code/

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

perl

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

ivysettings.xml:我可以"修改"默认设置而无需修改jar或完全替换它们吗?

我一直在阅读常春藤文档,我ivysettings.xml对ivy.jar中发现的默认值有疑问.

我想要做的就是将公共存储库更改为我们拥有的本地Maven存储库.而已.我可以将所有ivysettings*.xml文件复制到我的项目中,并用<ivy:settings>它来指向它,但这复制了很多东西.我也可以修改ivy.jar,但这会增加维护难题.开发人员必须使用我的ivy.jar,如果我们转到新版本,我将不得不再次修改它.

那么,我如何保留所有标准常春藤设置并简单地切换存储库以使用?我只是想将我的变化叠加到常春藤已经拥有的东西上.


还有两个问题:

  • ivyconf*.xml文件和ivysettings*.xml文件之间有什么区别?为什么Ivy中有重复的配置?
  • 什么是关于常春藤的好书?我现在正在使用Manning的Ant in Action,它以一种略微简洁的方式涵盖了Ivy,并且有点陈旧.该资源常春藤网站本身就太可怕了.

ivy

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

常春藤:获取Javadocs和Sources

我对Ivy很新,但已经让它与jar依赖项一起工作了.问题是尝试设置它,所以我可以独立于jar获取javadoc和源.

我有一个简单的测试项目,但无论我在做什么,我都会在其中获取带有类文件的jar.

我有以下ivy.xml文件:

<ivy-module version="1.0">
    <info
        organisation="com.vegicorp"
        module="test"
        revision="1.0"
        status="release"/>

    <configurations>
        <conf name="default" visibility="public" extends="runtime,master"/>
        <conf name="master" visibility="public"/>
        <conf name="compile" visibility="public"/>
        <conf name="provided" visibility="public"/>
        <conf name="runtime" visibility="public" extends="compile"/>
        <conf name="test" visibility="private" extends="runtime"/>
        <conf name="system" visibility="public"/>
        <conf name="sources" visibility="public"/>
        <conf name="javadoc" visibility="public"/>
        <conf name="optional" visibility="public"/>
    </configurations>

    <dependencies>
        <dependency org="commons-logging" name="commons-logging" rev="1.1.1"
            conf="compile->default"/>
        <dependency org="commons-logging" name="commons-logging" rev="1.1.1"
            conf="sources->default">
            <artifact name="commons-logging" type="sources" ext="jar"/>
        </dependency>
        <dependency org="commons-logging" name="commons-logging" rev="1.1.1"
            conf="javadoc->default">
            <artifact name="commons-logging" type="javadoc" ext="jar"/>
        </dependency>
    </dependencies>
</ivy-module>
Run Code Online (Sandbox Code Playgroud)

以下内容build.xml:

<project name="ivy-test" …
Run Code Online (Sandbox Code Playgroud)

ant ivy

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

'svn'不被视为内部或外部命令

当我试图在net beans IDE上构建我的maven应用程序时,我得到了这个错误,请任何帮助我.

Checking for local modifications: skipped.
Executing: cmd.exe /X /C "svn --non-interactive update D:\server"
Working directory: D:\server
Provider message:
The svn command failed.
Command output:
'svn' is not recognized as an internal or external command,
operable program or batch file.

------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 2.070s
Finished at: Mon Dec 17 19:24:19 IST 2012
Final Memory: 15M/175M
------------------------------------------------------------------------
Failed to execute goal org.codehaus.mojo:buildnumber-maven-plugin:1.1:create (default) on project red5-server: Couldn't update project. Error! -> [Help 1]

To see the …
Run Code Online (Sandbox Code Playgroud)

svn cmd maven

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

打开目录并按创建日期对文件进行排序

我需要打开目录并在创建文件时对文件进行排序.我可以找到一些讨论,使用Perl的标签,排序和文件,根据修改日期对文件进行排序.我认为这是比创建日期排序更常见的需求.我用Perl.之前有一些关于按照Perl以外的其他语言按创建日期排序的帖子,例如php或java.

例如,我需要执行以下操作:

opendir(DIR, $ARGV[0]);                             
my @files = "sort-by-date-created" (readdir(DIR)); 
closedir(DIR);

do things with @files...
Run Code Online (Sandbox Code Playgroud)

CPAN在sort命令上有一个页面,但它不是我可以访问的,我在页面上找不到"日期"或"创建"字样.

为了回应编辑,我应该说我使用Mac,OS 10.7.我知道在Finder中,有一个按创建日期选项排序,因此必须有某种指示创建日期以某种方式附加到此系统中的文件.

在回答答案时,以下是尝试对文件进行排序的另一个脚本版本:

#!/usr/bin/perl
use strict; use warnings;

use File::stat; # helps with sorting files by ctime, the inode date that hopefully can serve as creation date

my $usage = "usage: enter name of directory to be scanned for SNP containing lines\n";
die $usage unless @ARGV == 1;

opendir(DIR, $ARGV[0]);                             #open directory for getting file list
#my @files = (readdir(DIR));
my @file_list = grep ! …
Run Code Online (Sandbox Code Playgroud)

sorting perl file

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

GNU Make.为什么这种复杂的语法生成依赖?

我正在阅读使用GNU Make管理项目,并在第2.7章 - 自动依赖关系生成中找到了这个例子.作者从GNU手册中说出了他们:

%.d: %c
        $(CC) -M $(CPPFLAGS $< > $@.$$$$; \
              sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
              rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

但是,我能够用这个做同样的事情(注意sed):

-include $(subst .c,.d,$(SOURCES))

%.d: %.c
          @$(CC) -M $(CPPFLAGS) $<  | sed 's|:| $*.d : |'  > $@;
Run Code Online (Sandbox Code Playgroud)

所有这些行都是生成依赖项,然后添加*.d名称.他们不得不改变第一行:

  foo.o: bar.h foo.h fubar.h
Run Code Online (Sandbox Code Playgroud)

to foo.o foo.d:bar.h foo.h fubar.h

我更简单,似乎工作得很好,但我认为GNU伙伴有他们sed命令的理由.也:

  • 为什么要将文件重定向到sed?为什么不简单地将它作为commond line参数
  • 为什么不完全跳过中间文件?

我知道GNU的人也可以想到这些,但出于某种原因,选择了更复杂的设置.我只是想了解他们的推理,所以我可以动态地做这些.

makefile gnu-make

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

标签 统计

perl ×4

ant ×3

ivy ×2

cmd ×1

file ×1

gnu-make ×1

jar ×1

loops ×1

makefile ×1

maven ×1

perl-module ×1

sorting ×1

svn ×1