0

ここに画像の説明を入力してくださいデータベースから取得した統計に基づいてレポートを自動生成しようとしています。私はperlを使用してデータベースと通信し、興味深い変数をスカラー/配列などとして保存します。次に、pdflatexを使用する前にラテックスファイルを作成します。ここに画像の説明を入力してくださいただし、スカラー値をpdfに渡そうとすると問題が発生します。たとえば、以下の私のコードと出力を参照してください

#!/usr/bin/perl
#
#
# Description: Write a monthly report from the database using latex
#    
# Parameters:
#
# History: 
#
# CVS ID: $Date: 2012/03/01 16:13:03 $ $Revision: 1.1 $
########################################################################

#Add library
use lib "$ENV{HOME}/perllib";

#Call modules
use DBI;                     # Postgres communication functions
use File::Temp qw/tempfile/;
use File::Copy;
use Cwd;

my $date_start = '01/12/12';
my $date_stop  = '31/12/12';


%hash=("01"=>"Jan","02"=>"Feb","03"=>"Mar","04"=>"Apr","05"=>"May","06"=>"Jun","07"=>"Jul","08"=>"Aug","09"=>"Sep","10"=>"Oct","11"=>"Nov","12"=>"Dec");
$date_start=~/([0-9]{2})\/([0-9]{2})\/([0-9]{2}).*/;
my $date_string = "$hash{$2}$3";
my $report_name = "$date_string"."_monthly_report.pdf";



#Pragmas

use warnings;
no warnings "uninitialized";  # Don't warn about unitialized variables#
use strict 'vars';          # Force all variables to have defined scope

my $repdir = "/home/nm/Desktop/";
my ($fh, $filename) = tempfile( SUFFIX => '.tex', DIR => $repdir);

# LaTeX Header information
print $fh <<'END';
\documentclass{article}
\usepackage{underscore}
\usepackage{fullpage}
\usepackage{multicol}
\usepackage[margin=0.5in]{geometry}
\usepackage{graphicx}
\usepackage{array}

\newenvironment{nstabbing}
  {\setlength{\topsep}{0pt}%
   \setlength{\partopsep}{0pt}%
   \tabbing}
  {\endtabbing}

\begin{document}


\begin{center}
\LARGE \bf MONTHLY SUMMARY
\end{center}


END

my $blank = " ";
# Body of LaTeX document
print $fh <<END;
This report details clinical and imaging statistics from $date_start to $date_stop

END
print $fh <<'END';
This report details clinical and imaging statistics from $date_start to $date_stop


\large \bf Clinical Statistics

\normalsize \rm 

\begin{table}[h]
\centering
\begin{tabular}{cccc} 
\hline
Task & AR & DB & GM \\
Cannulation & 1 & 2 & 3 \\
\hline
\end{tabular}
\end{table}

END

# Closing of LaTeX document
print $fh <<'END';
\end{document}
END

# Run LaTeX compiler to generate PDF
system('pdflatex -output-directory ' . $repdir . ' ' . $filename);
my $file_prefix = substr($filename, 0, -4);

#remove aux, log and tex files
my $auxfile = $file_prefix . ".aux";
my $logfile = $file_prefix . ".log";
my $pdffile = $file_prefix . ".pdf";

system('rm ' . $auxfile . ' ' .  $logfile . ' ' . $filename);
$filename="$repdir$report_name";
move($pdffile,$filename);

system('acroread ' . $filename);

どして

print $fh <<END;
This report details clinical and imaging statistics from $date_start to $date_stop
END

次はそうではありませんが、正しい出力を与えますか?

print $fh <<'END';
This report details clinical and imaging statistics from $date_start to $date_stop
END

前者を使用してディスプレイ上のテーブルを作成しようとしましたが、それを適切な形式で取得できませんでした。たとえば、追加の列が作成され、GMの横にカニューレが配置されます。また、前者を使用する場合、ラテックスキーワードの前に余分な/を配置する必要がありました。たとえば、/bfではなく//bfですが、後者('END')では配置する必要はありません。

理想的には、テーブルとラテックスのフォーマットが期待どおりに機能するため、「END」を使用することをお勧めします。ただし、スカラーと配列の値を渡すことができません。どうすればこれを管理できますか?

4

1 に答える 1

3

周囲の一重引用符は'END'、ヒアドキュメントが一重引用符で囲まれた文字列のように扱われることを意味します。変数はその中で補間されません。

デフォルトでは、二重引用符で囲まれた文字列として扱われます。これが、最初の例が機能する理由です。二重引用符を使用して、二重引用符で囲まれた文字列のようにすることを明示的に指定することもできます<<"END";(これはデフォルトの動作に似ていますが、おそらくより明確です)。

補間(二重引用符で囲まれた)文字列を使用することの必然的な結果は、バックスラッシュなどをエスケープする必要があることです。バックスラッシュは、この種の文字列内で特別な意味を持ちます。実際には、変数を補間してエスケープを必要とする文字列、または補間せずにエスケープを必要としない文字列のいずれかを選択する必要があります。

于 2013-01-17T13:36:40.553 に答える