質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

1625閲覧

perl で出力先を切り替えるのにハッシュの要素を使いたい

mit0223

総合スコア3401

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2017/02/28 00:15

###前提・実現したいこと
Perl で、ある時はメッセージをログファイルに出力し、あるときは標準出力に出力するというようなことをするために、 print の引数?にハッシュの要素から取得したファイルハンドルを与えたい。

###発生している問題・エラーメッセージ
以下のメッセージが出ます。

String found where operator expected at ng.pl line 5, near "} "Hello main!\n"" (Missing operator before "Hello main!\n"?)

###該当のソースコード

perl

1#!/usr/bin/perl 2use strict; 3my $config = {}; 4$config->{'filehandle'} = \*STDOUT; 5print $config->{'filehandle'} "Hello main!\n";

###試したこと
エラーメッセージの意味はわかるのですが、print の後ろにファイルハンドルを書く構文はあるはずで、なぜこれをファイルハンドルと認識してもらえないのかがわかりません。
ハッシュの要素ではなく、以下のように普通の変数を渡すと動きますが、その差がわかっていません。

Perl

1#!/usr/bin/perl 2use strict; 3my $filehandle = \*STDOUT; 4print $filehandle "Hello main!\n";

###補足情報(言語/FW/ツール等のバージョンなど)
OS: Mac OS Sierra 10.12.3

$ perl -V Summary of my perl5 (revision 5 version 18 subversion 2) configuration: Platform: osname=darwin, osvers=16.0, archname=darwin-thread-multi-2level uname='darwin osx300.apple.com 16.0 darwin kernel version 15.0.0: wed apr 6 00:55:38 pdt 2016; root:xnu-3247.1.106.2.8~1development_x86_64 x86_64 ' config_args='-ds -e -Dprefix=/usr -Dccflags=-g -pipe -Dldflags= -Dman3ext=3pm -Duseithreads -Duseshrplib -Dinc_version_list=none -Dcc=cc' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=define, use64bitall=define, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-arch x86_64 -arch i386 -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector', optimize='-Os', cppflags='-g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector' ccversion='', gccversion='4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)', gccosandvers='' intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='cc -mmacosx-version-min=10.12.2', ldflags ='-arch x86_64 -arch i386 -fstack-protector' libpth=/usr/lib /usr/local/lib libs= perllibs= libc=, so=dylib, useshrplib=true, libperl=libperl.dylib gnulibc_version='' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags='-arch x86_64 -arch i386 -bundle -undefined dynamic_lookup -fstack-protector' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API Locally applied patches: /Library/Perl/Updates/<version> comes before system perl directories installprivlib and installarchlib points to the Updates directory Built under darwin Compiled at Jul 30 2016 16:59:44 @INC: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実行すると以下のエラーが発生する為、構文解析で問題が発生していると思われます。
String found where operator expected at - line 4, near "} "Hello main!\n""

コンパイラーに、ここまではひとくくりであると指定してあげると動きます。
($config->{filehandle}を{}でくくります。)

perl

1use strict; 2my $config = {}; 3$config->{'filehandle'} = \*STDOUT; 4print {$config->{filehandle}} "Hello main!\n";

投稿2017/02/28 00:39

編集2017/02/28 00:41
ester41

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mit0223

2017/02/28 00:49

ありがとうございました。解決しました。なんか、演算子の結合度みたいなのがあるんですね。まだ、ルールがよくわかっていません・・・
mit0223

2017/02/28 13:28

URL ありがとうございました。スッキリしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問